Різниця між Math.Floor () та Math.Truncate ()


422

Яка різниця між Math.Floor()і Math.Truncate().NET?


8
наприклад, Math.Floor (5.4) = 5 Math.Truncate (5.4) = 5
subramani

3
вам це справді потрібно через 10 років? lol
L_Church

1
чому через 10 років є щедрість? відповідей уже багато. чи щось мені тут не вистачає?
Калюжа

3
Цей хлопець задав лише 1 питання і з цього часу покинув сайт. Я здогадуюсь, що це все, що він завжди хотів знати ..: D
Нікос

Відповіді:


484

Math.Floorокругляє вниз, Math.Ceilingокругляє вгору і Math.Truncateокругляє до нуля. Таким чином, Math.Truncateце як Math.Floorдля додатних чисел, так і Math.Ceilingдля негативних чисел. Ось посилання .

Для повноти Math.Roundокругляйте до найближчого цілого числа. Якщо число знаходиться в середині між двома цілими числами, то воно округляється до парного. Довідково.

Дивіться також: Відповідь Пакса Діабло . Настійно рекомендується!


31
@Chris, я пропоную вам виправити свій опис Round, є два способи округлення (AwayFromZero і ToEven), і він не округлюється до найближчого цілого числа, оскільки він може робити також дробове округлення.
paxdiablo

1
Отже, лише короткий додаток до початкового запитання - в чому різниця між Math.Truncate і просто введенням десяткових чи подвійних до int? Чи не було б це також просто кругом до нуля?
Ноам Гал

8
Коли (int)myDoubleвідрізняється від (int)Math.Truncate(myDouble)?
mpen

2
Що (int) дорівнює в класі Math?
Лей Ян

386

Перейдіть за цими посиланнями для описів MSDN:

  • Math.Floor, яка округляється до негативної нескінченності.
  • Math.Ceiling, яка округляється до позитивної нескінченності.
  • Math.Truncate, яка округляється вгору або вниз до нуля.
  • Math.Round, яке округляє до найближчого цілого чи заданої кількості знаків після коми. Ви можете вказати поведінку, якщо вона точно рівновіддалена між двома можливостями, наприклад, округленням, щоб кінцева цифра була рівною (" Round(2.5,MidpointRounding.ToEven)" стає 2) або так, що вона знаходиться далі від нуля (" Round(2.5,MidpointRounding.AwayFromZero)" стає 3).

Наступна діаграма та таблиця можуть допомогти:

-3        -2        -1         0         1         2         3
 +--|------+---------+----|----+--|------+----|----+-------|-+
    a                     b       c           d            e

                       a=-2.7  b=-0.5  c=0.3  d=1.5  e=2.8
                       ======  ======  =====  =====  =====
Floor                    -3      -1      0      1      2
Ceiling                  -2       0      1      2      3
Truncate                 -2       0      0      1      2
Round (ToEven)           -3       0      0      2      3
Round (AwayFromZero)     -3      -1      0      2      3

Зауважте, що Roundце набагато потужніше, ніж здається, просто тому, що він може округляти певну кількість десяткових знаків. Всі інші завжди круглі до нуля десяткових знаків. Наприклад:

n = 3.145;
a = System.Math.Round (n, 2, MidpointRounding.ToEven);       // 3.14
b = System.Math.Round (n, 2, MidpointRounding.AwayFromZero); // 3.15

Для інших функцій вам потрібно використовувати хитрості множення / ділення, щоб досягти такого ж ефекту:

c = System.Math.Truncate (n * 100) / 100;                    // 3.14
d = System.Math.Ceiling (n * 100) / 100;                     // 3.15

7
Пакс, я думаю, у вас помилка з: Раунд (AwayFromZero) -3 -2 1 2 3 Math.Round (-1,2, MidpointRounding.AwayFromZero) == -1 Math.Round (0,3, MidpointRounding.AwayFromZero) == 0,0 і т.
Д.

1
Дякую, @dtroy, мені ніколи не було необхідності користуватися цим режимом, і, хоча я правильно це задокументував, якщо текст, я цілком зрозумів приклади неправильно. Сподіваємось, це зараз виправлено.
paxdiablo

Вибачте, щоб прокоментувати таке давнє запитання, але я мушу запитати: Як ви можете округлити "ToEven" до двох десяткових знаків? Напевно, непарне і навіть стосується лише цілих чисел?
Річібан

4
@Richiban, думати evenяк властивість кінцевої цифри в округляється цифра, а не в тому сенсі , весь число повинне бути кратне двом. До речі, шкода пройшло так довго, щоб повернутися до вас, сподіваюся, ви не просто сиділи навколо, чекаючи моєї відповіді :-)
paxdiablo

62

Math.Floor() кругляє до негативної нескінченності

Math.Truncate округляє вгору або вниз до нуля.

Наприклад:

Math.Floor(-3.4)     = -4
Math.Truncate(-3.4)  = -3

поки

Math.Floor(3.4)     = 3
Math.Truncate(3.4)  = 3

2
Приємне і просте пояснення з коротким прикладом, це слід позначити як відповідь на це питання.
nivs1978

44

Деякі приклади:

Round(1.5) = 2
Round(2.5) = 2
Round(1.5, MidpointRounding.AwayFromZero) = 2
Round(2.5, MidpointRounding.AwayFromZero) = 3
Round(1.55, 1) = 1.6
Round(1.65, 1) = 1.6
Round(1.55, 1, MidpointRounding.AwayFromZero) = 1.6
Round(1.65, 1, MidpointRounding.AwayFromZero) = 1.7

Truncate(2.10) = 2
Truncate(2.00) = 2
Truncate(1.90) = 1
Truncate(1.80) = 1

29

Math.floorsliiiide ліворуч ...
Math.ceilsliiiide праворуч ...
Math.truncatecriiiiss crooooss (підлога / стеля завжди у напрямку до 0)
Math.roundcha cha, справжній гладкий ... (перейти до найближчої сторони)

Ходімо на роботу! (⌐ □ _ □)

Ліворуч ... Math.floor
Візьміть це вже зараз ... --
Два хмелі цього разу ...-=2

Всі плескайте в руки

Як низько можна піти? Чи можна спуститися низько? Весь шлях до floor?

if (this == "wrong")
    return "i don't wanna be right";

Math.truncate(x)також те саме, що int(x).
видаливши позитивну чи негативну частку, ви завжди прямуєте до 0.


HAHAHA приємний ремікс.
Даніель каже, що

26

Вони функціонально еквівалентні додатним числам. Різниця полягає в тому, як вони обробляють від’ємні числа.

Наприклад:

Math.Floor(2.5) = 2
Math.Truncate(2.5) = 2

Math.Floor(-2.5) = -3
Math.Truncate(-2.5) = -2

MSDN-посилання: - Метод Math.Floor - Метод Math.Truncate

PS Остерігайтеся Math.Round, можливо, це не те, чого ви очікуєте.

Щоб отримати "стандартний" результат округлення, використовуйте:

float myFloat = 4.5;
Console.WriteLine( Math.Round(myFloat) ); // writes 4
Console.WriteLine( Math.Round(myFloat, 0, MidpointRounding.AwayFromZero) ) //writes 5
Console.WriteLine( myFloat.ToString("F0") ); // writes 5

24

Спробуйте це, приклади:

Math.Floor () проти Math.Truncate ()

Math.Floor(2.56) = 2
Math.Floor(3.22) = 3
Math.Floor(-2.56) = -3
Math.Floor(-3.26) = -4

Math.Truncate(2.56) = 2
Math.Truncate(2.00) = 2
Math.Truncate(1.20) = 1
Math.Truncate(-3.26) = -3
Math.Truncate(-3.96) = -3

Також Math.Round ()

   Math.Round(1.6) = 2
   Math.Round(-8.56) = -9
   Math.Round(8.16) = 8
   Math.Round(8.50) = 8
   Math.Round(8.51) = 9

math.floor()

Повертає найбільше ціле число, менше або рівне вказаному числу. MSDN system.math.floor

math.truncate()

Обчислює невід'ємну частину числа. MSDN system.math.truncate



15

Math.Floor(): Повертає найбільше ціле число, менше або рівне вказаному номеру з плаваючою комою подвійної точності.

Math.Round(): Обводить значення на найближче ціле число або на вказану кількість дробових цифр.


1
ОП запитала про різницю між, Floor()а Truncate()не Floor()і Round().
Роберт Колумбія

5

Math.floor()завжди буде округляти вниз, тобто, вона повертає менше ціле число. Поки round()поверне найближче ціле число

математичний поверх ()

Повертає найбільше ціле число, менше або рівне вказаному числу.

math.truncate ()

Обчислює невід'ємну частину числа.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.