Разница между Math.Floor() и Math.Truncate()

В чем разница между Math.Floor() а также Math.Truncate() в.NET?

10 ответов

Math.Floor округляет, Math.Ceiling округляет и Math.Truncate округляет до нуля. Таким образом, Math.Truncate как Math.Floor для положительных чисел и тому подобное Math.Ceiling для отрицательных чисел. Вот ссылка.

Для полноты Math.Round округляет до ближайшего целого числа. Если число находится точно посередине между двумя целыми числами, то оно округляется до четного. Ссылка.

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

Перейдите по этим ссылкам для описания 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

Math.Floor() округляет до отрицательной бесконечности

Math.Truncate округляется вверх или вниз до нуля.

Например:

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

в то время как

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

Math.floor Скольжение влево...
Math.ceil скользит вправо...
Math.truncate criiiss crooooss (пол / потолок всегда к 0)
Math.round Ча-ча, очень гладко... (перейти к ближайшей стороне)

Пошли на работу! (⌐□_□)

Слева... Math.floor
Забери это сейчас, все... --
На этот раз два прыжка... -=2

Все хлопают в ладоши ✋✋

Как низко ты можешь пасть? Вы можете пойти вниз? Вплоть до floor?

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

Math.truncate(x) так же, как int(x),
удаляя положительную или отрицательную дробь, вы всегда движетесь к 0.

Некоторые примеры:

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

Они функционально эквивалентны с положительными числами. Разница в том, как они обрабатывают отрицательные числа.

Например:

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

math.floor()

Возвращает наибольшее целое число, меньшее или равное указанному числу.

MSDN system.math.floor

math.truncate()

Вычисляет неотъемлемую часть числа.

MSDN system.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() округляет "в сторону отрицательной бесконечности" в соответствии со стандартом IEEE 754, раздел 4.

Math.Truncate() округляет "до ближайшего целого числа к нулю".

Math.Floor()Возвращает наибольшее целое число, меньшее или равное указанному числу с плавающей запятой двойной точности.

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

Mat.floor() всегда будет округлять, т.е. возвращает МЕНЬШЕ. В то время как round() вернет БЛИЖАЙШЕЕ целое число

Math.Floor():

Он дает наибольшее целое число, меньшее или равное заданному числу.

    Math.Floor(3.45) =3
    Math.Floor(-3.45) =-4

Math.Truncate():

Удаляет десятичные знаки числа и заменяет их на ноль.

Math.Truncate(3.45)=3
 Math.Truncate(-3.45)=-3

Также из приведенных выше примеров мы видим, что пол и усечение одинаковы для положительных чисел.

Исходя из математического определения пола, то есть "Наибольшее целое число, меньшее или равное числу", это полностью однозначно, тогда как Truncate просто удаляет дробную часть, что эквивалентно округлению до 0.

Truncate удаляет десятичную точку.

Другие вопросы по тегам