Math.Floor против бросания в интегральный тип в С# - программирование
Подтвердить что ты не робот

Math.Floor против бросания в интегральный тип в С#

Есть ли какие-либо причины, по которым вы бы предпочли использовать Math.Floor против литья в интегральный тип?

double num;
double floor = Math.Floor(num);

ИЛИ

double num;
long floor = (long)num;
4b9b3361

Ответ 1

Существуют некоторые различия между отливкой в ​​интегральный тип и использованием Math.Floor:

  • При переходе к интегральному типу вы получите целостный тип (очевидно). Поэтому, если вы хотите сохранить номер как двойной, использование Floor проще.
  • Как следствие 1, кастинг будет работать некорректно, если заданное число слишком велико, чтобы быть представленным данным интегральным типом (двойной может представлять гораздо большие числа, чем длинный).
  • Пол раундов к отрицательной бесконечности. Кастинг округляется к нулю.

Ответ 2

Он отличается отрицательными значениями:

double num = -1.3;
double floor = Math.Floor(num); // = -2
long cast = (long)num; // = -1

Ответ 3

Math.Floor - принципиально другая операция от усечения, потому что она обрабатывает отрицательные числа по-разному. Math.Floor(-1.5) == -2.0, а (int)-1.5 == -1.

Ответ 4

В дополнение к другим ответам не забывайте, что кастинг может завершиться неудачно, если Floor будет успешным:

decimal d = decimal.MaxValue;

decimal f = Math.Floor(d);    // succeeds
long l = (long)d;             // fails

Ответ 5

Даже если вы имеете дело только с положительными значениями, значение double не всегда вписывается в long.

См. диапазоны long и double в MSDN.