Разница между Math.Floor () и Math.Truncate () - PullRequest
393 голосов
/ 01 августа 2008

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

Ответы [ 10 ]

456 голосов
/ 01 августа 2008

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

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

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

367 голосов
/ 24 февраля 2009

Перейдите по этим ссылкам для описания 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
55 голосов
/ 19 июля 2011

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

Math.Truncate округляется до нуля.

Например:

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

пока

Math.Floor(3.4)     = 3
Math.Truncate(3.4)  = 3
42 голосов
/ 05 августа 2008

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

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
23 голосов
/ 02 января 2015

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

Например:

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

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

MSDN ссылки: - Math.Floor Method - Математический метод усечения

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
21 голосов
/ 07 июня 2012

Math.Floor() раундов «к отрицательной бесконечности» в соответствии с Стандартом IEEE 754 раздел 4.

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

19 голосов
/ 12 февраля 2016

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
14 голосов
/ 11 февраля 2018

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

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

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

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

Как низко вы можете пойти? Вы можете пойти вниз? Всю дорогу до floor?

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

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

13 голосов
/ 19 сентября 2013

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

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

2 голосов
/ 17 июля 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...