Подтвердить что ты не робот

Почему Math.Round не возвращает int?

В С#, почему функции математики округления не перекрываются, Floor, Ceiling и Round возвращают int? Учитывая, что результат функции всегда будет целым числом, почему он возвращает float, double или decimal?

4b9b3361

Ответ 1

double имеет диапазон ± 5,0 × 10 -324 до ± 1,7 × 10 308 и long имеет диапазон от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807. К сожалению, не все интегральные значения с плавающей запятой могут быть представлены целым числом.

Например, 1e19 уже превысил диапазон 64-разрядного целого числа со знаком.

(long)Math.Round(1e19) == -9223372036854775808L // WTF?

Хотя верно, что перегрузки с одним аргументом Math.Round(double) и Math.Round(decimal) всегда возвращают целочисленное значение, эти перегрузки по-прежнему не могут возвращать целочисленный тип значения.

Если вы знаете, что значение, переданное функции, вернет значение, представляемое типом целочисленного значения, вы можете сделать его самостоятельно. Библиотека не сделает этого, потому что ему нужно рассмотреть общий случай.

Ответ 2

Учитывая, что результат функции всегда будет целым числом,

Нет, этого не будет. Вы даже можете указать количество цифр с помощью Math.Round Method (Double, Int32)

цифры Тип:
System.Int32
Количество дробных цифр в возвращаемом значении.

Ответ 3

Это делается для того, чтобы включить числа, большие, чем те, которые включены в диапазон int. Таким образом, Math.Floor вернет двойной, который может быть отброшен до int или длинным, исходя из размера и разработчика. Если вы попробовали Math.Floor вне диапазона int, он бы потерпел неудачу, если Math.Floor вернул int, но это не так, он возвращает двойной, который вы можете отложить до конца.

     double d = 4147483647.5678;
     long a = (long)Math.Floor(d);
     int b = (int)Math.Floor(d);
     Console.WriteLine(a);
     Console.WriteLine(b);

Обратите внимание, что при литье в int b возвращается к MIN int, так как int не может его разместить.