Разница между 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
@ Крис, я предлагаю вам исправить описание Раунда, есть два способа округления (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
Пакс, я думаю, у тебя ошибка с: Round (AwayFromZero) -3 -2 1 2 3 Math.Round (-1.2, MidpointRounding.AwayFromZero) == -1 Math.Round (0.3, MidpointRounding.AwayFromZero) == 0.0 и т. Д.
dtroy

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.roundча-ча-ха, очень гладко ... (перейти к ближайшей стороне)

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

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

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

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

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

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


Хахаха хороший ремикс.
Даниил говорит: восстанови Монику

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


23

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

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


15

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

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


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

5

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

Math.floor ()

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

math.truncate ()

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.