Почему Math.Ceiling возвращает double? - PullRequest
40 голосов
/ 17 апреля 2011

В C # метод Math.Ceiling возвращает значение double.Почему не возвращается int?

Ответы [ 5 ]

25 голосов
/ 17 апреля 2011

double имеет больший диапазон значений, чем int:

Тип значения Double представляет 64-разрядное число двойной точности со значениями в диапазоне от отрицательного 1.79769313486232e308 до положительного 1.79769313486232e308,а также положительный или отрицательный ноль, PositiveInfinity, NegativeInfinity и Not-a-Number (NaN).

Double соответствует стандарту IEC 60559: 1989 (IEEE 754) для двоичной арифметики с плавающей точкой.

Этот стандарт гласит, что double имеет 52-битную мантиссу, что означает, что он может представлять любое целое число длиной до 52 бит без потери точности.

Поэтому, если вход большойдостаточно, выход не помещается в int (который имеет только 32 бита).

22 голосов
/ 17 апреля 2011

В документации говорится о возвращаемом значении:

Наименьшее целое число, большее или равное a.Если a равно NaN, NegativeInfinity или PositiveInfinity, возвращается это значение.

Поэтому возвращаемое значение должно быть двойным, поскольку NaN, NegativeInfinity и PositiveInfinity являются полями типа Double.

6 голосов
/ 17 апреля 2011

Math.Ceiling может возвращать либо double, либо decimal, в зависимости от переданного типа. Другими словами, тип вывода метода соответствует типу ввода (вполне разумно).

Они могли бы добавить третью перегрузку, которая принимает int и возвращает int, но особого смысла в этом не было бы - функция всегда просто возвращала бы свой ввод.

Похоже, вы предполагаете, что цель Math.Ceiling - преобразовать значение с плавающей запятой в целое число, но обычно это не так.

2 голосов
/ 17 апреля 2011

Он должен возвращать double, чтобы быть завершенным. Любая математическая операция с участием NaN всегда возвращает NaN. Таким образом, если вы передадите NaN в функцию floor (), вы не сможете вернуть NaN, поскольку в Int нет эквивалента. Кроме того, учитывая, что Double имеет более широкий диапазон, что можно было бы вернуть для целочисленных значений вне диапазона? Что можно вернуть за +/- инф?

0 голосов
/ 17 апреля 2011

Поскольку double может содержать большие числа, чем int или long.По той же причине нет неявного приведения от double до int.

...