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

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

Ответ 1

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

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

Смотрите также: Ответ Pax Diablo. Очень рекомендуется!

Ответ 2

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

Ответ 3

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

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

Например:

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

while

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

Ответ 4

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

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

Ответ 5

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

Например:

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

P.S. Остерегайтесь математики. Возможно, это не так, как вы ожидаете.

Чтобы получить "стандартный" результат округления, используйте:

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

Ответ 6

Math.Floor() раунды "к отрицательной бесконечности" в соответствии с IEEE Standard 754, раздел 4.

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

Ответ 7

Попробуйте это, Примеры:

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

Ответ 8

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

Отпусти на работу! (⌐ □ _ □)

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

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

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

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

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

Ответ 9

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

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

Ответ 10

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