В С# метод Math.Ceiling
возвращает значение double
. Почему он не возвращает int
?
Почему Math.Ceiling возвращает double?
Ответ 1
В документации говорится о возвращаемом значении:
Наименьшее целое число, большее или равное a. Если a равно NaN, NegativeInfinity или PositiveInfinity, это значение возвращается.
Поэтому возвращаемое значение должно быть двойным, так как NaN, NegativeInfinity и PositiveInfinity являются полями Double.
Ответ 2
double
имеет больший диапазон значений, чем int
:
Тип двойного значения представляет собой 64-битное число с двойной точностью с значения от отрицательных 1.79769313486232e308 - положительный 1.79769313486232e308, а также положительный или отрицательный ноль, PositiveInfinity, NegativeInfinity, и Not-a-Number (NaN).
Двойной соответствует требованиям IEC 60559: 1989 (IEEE 754) для двоичная арифметика с плавающей запятой.
В этом стандарте говорится, что double
имеет 52-битную мантиссу, что означает, что он может представлять любое целое число до 52 бит в длину без потери точности.
Поэтому, если вход достаточно велик, вывод не помещается внутри int
(который имеет только 32 бита).
Ответ 3
Math.Ceiling
может возвращать либо double
, либо decimal
, в зависимости от типа, переданного в. Другими словами, тип вывода метода соответствует типу ввода (довольно разумно).
Они могли бы добавить третью перегрузку, которая берет int
и возвращает int
, но не было бы большого смысла в этом - функция всегда возвращала бы свой вход.
Предполагается, что целью Math.Ceiling
является присвоение значения с плавающей запятой целому числу, но обычно это не так.
Ответ 4
Он должен возвратиться дважды, чтобы быть полным. Любая математическая операция с использованием NaN всегда возвращает NaN. Таким образом, если вы передадите функцию NaN to ceiling(), то нельзя было бы вернуть NaN, так как в Int нет эквивалента. Также, учитывая, что Double имеет более широкий диапазон, что бы вернуть для тех значений, которые находятся вне допустимого диапазона? Что возвращается для +/- inf?
Ответ 5
Потому что double
может содержать большее число, чем int
или long
. По той же причине нет неявного перевода из double
в int
.