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.