Разница между 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
paxdiablo
источник
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
Sandesh
источник
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

Сафин Чако
источник
15

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

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

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

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

Math.floor ()

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

math.truncate ()

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

Vidy
источник
0

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

Пол Мур
источник