Почему не делает Математики. Раунд/Пол/Потолок возвращается долго или интервал?

Каждый раз я использую Math.Round/Floor/Ceiling Я всегда бросал к int (или возможно long при необходимости). Почему точно делают они возвращаются double если это всегда возвращает целое число.

22
задан TheCloudlessSky 14 August 2010 в 01:56
поделиться

3 ответа

Результат может не соответствовать типу int (или long). Дальность дубля намного больше.

Приблизительный диапазон удвоения: от ± 5,0 × 10 -324 до ± 1,7 × 10 308

(Источник)

29
ответ дан 29 November 2019 в 04:57
поделиться

Я согласен с ответом Марка о том, что результат может не соответствовать long , но вы можете задаться вопросом: что, если бы в C # был гораздо более длинный тип long ? Что ж, вот что происходит в Python с целыми числами произвольной длины:

>>> round(1.23e45)
1229999999999999973814869011019624571608236032

Большинство цифр - это «шум» из-за ошибки округления с плавающей запятой. Возможно, часть мотивации для Round / Floor / Ceiling , возвращающего double в C #, заключалась в том, чтобы избежать иллюзии ложной точности.

Альтернативное объяснение состоит в том, что модуль .NET Math использует код, написанный на C, в котором floor и ceil возвращают типы с плавающей запятой.

8
ответ дан 29 November 2019 в 04:57
поделиться

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

Вы могли бы написать свой собственный метод, который преобразовал бы его в int примерно за 2 строчки кода, и это потребовало бы гораздо меньше усилий, чем публикация вопроса о переполнении стека ...

-2
ответ дан 29 November 2019 в 04:57
поделиться