Math.Floor против бросания в интегральный тип в С#
Есть ли какие-либо причины, по которым вы бы предпочли использовать Math.Floor против литья в интегральный тип?
double num;
double floor = Math.Floor(num);
ИЛИ
double num;
long floor = (long)num;
Ответы
Ответ 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.