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

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

1.08.2008 00:59:11
например, Math.Floor (5.4) = 5 Math.Truncate (5.4) = 5
subramani 14.12.2011 10:49:36
вам действительно нужно это после 10 лет странно? LOL
L_Church 9.02.2018 16:14:23
почему через 10 лет есть щедрость? уже есть много ответов. есть что-то, чего я здесь не хватает?
Puddle 11.02.2018 14:49:46
Этот парень задал только 1 вопрос и покинул сайт с тех пор. Я думаю, это все, что он всегда хотел знать ..: D
Nikos 11.10.2018 17:31:00
11 ОТВЕТОВ

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

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

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

480
23.05.2017 12:03:01
@ Крис, я предлагаю вам исправить описание Раунда, есть два способа округления (AwayFromZero и ToEven), и он не округляется до ближайшего целого числа, поскольку он также может выполнять дробное округление.
paxdiablo 24.02.2009 02:44:18
Итак, короткое добавление к исходному вопросу - в чем разница между Math.Truncate и простым приведением десятичного числа или двойного к int? разве это не было бы также просто к нулю?
Noam Gal 19.05.2009 10:40:50
Когда (int)myDoubleотличается от (int)Math.Truncate(myDouble)?
mpen 17.06.2012 17:57:33
Чему равен (int) класс Math?
Lei Yang 18.07.2016 01:58:36

Перейдите по этим ссылкам для описания 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
382
27.12.2012 12:13:33
Пакс, я думаю, у тебя ошибка с: Round (AwayFromZero) -3 -2 1 2 3 Math.Round (-1.2, MidpointRounding.AwayFromZero) == -1 Math.Round (0.3, MidpointRounding.AwayFromZero) == 0.0 и т. Д.
dtroy 5.05.2009 03:49:41
Спасибо, @dtroy, у меня никогда не было необходимости использовать этот режим и, хотя я правильно задокументировал его, если текст, я полностью ошибся в примерах. Надеюсь, это исправлено.
paxdiablo 5.05.2009 04:16:40
Извините за комментарий к такому старому вопросу, но я должен спросить: как вы можете округлить «ToEven» до двух десятичных знаков? Конечно, странно и даже применимо только к целым числам?
Richiban 20.11.2014 16:10:43
@Richiban - evenэто свойство конечной цифры округленного числа, а не значение целого числа , кратного двум. Кстати, извините, что так долго возвращался к вам, надеюсь, вы просто сидели без дела, ожидая моего ответа :-)
paxdiablo 5.08.2015 05:10:10

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

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

Например:

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

пока

Math.Floor(3.4)     = 3
Math.Truncate(3.4)  = 3
59
11.11.2017 03:45:52
Хорошее и простое объяснение с коротким примером, это должно быть отмечено как ответ на этот вопрос.
nivs1978 24.08.2018 08:37:58

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

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
43
24.02.2009 22:26:38

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

Например:

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
25
18.04.2016 19:15:59

Math.floorsliiiide влево ...
Math.ceilsliiiide вправо ...
Math.truncatecriiiiss crooooss (этаж / потолок всегда в направлении 0)
Math.roundcha cha, очень гладко ... (перейти к ближайшей стороне)

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

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

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

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

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

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

25
22.02.2018 16:28:33
Хахаха хороший ремикс.
Daniel says Reinstate Monica 20.05.2019 18:39:51

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

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

22
7.06.2012 18:15:14

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

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

22
5.02.2020 06:58:58

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

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

14
18.04.2016 19:11:26
ОП спросил о разнице между Floor()а Truncate(), а не Floor()и Round().
Robert Columbia 11.11.2017 00:38:58

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

Math.floor ()

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

math.truncate ()

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

5
5.02.2020 07:42:44

Обрезать капли десятичной дроби ****

0
22.03.2020 19:17:02