Разница между 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.