Каждый раз я использую Math.Round/Floor/Ceiling
Я всегда бросал к int
(или возможно long
при необходимости). Почему точно делают они возвращаются double
если это всегда возвращает целое число.
Результат может не соответствовать типу int (или long). Дальность дубля намного больше.
Приблизительный диапазон удвоения: от ± 5,0 × 10 -324 до ± 1,7 × 10 308
Я согласен с ответом Марка о том, что результат может не соответствовать long
, но вы можете задаться вопросом: что, если бы в C # был гораздо более длинный тип long
? Что ж, вот что происходит в Python с целыми числами произвольной длины:
>>> round(1.23e45)
1229999999999999973814869011019624571608236032
Большинство цифр - это «шум» из-за ошибки округления с плавающей запятой. Возможно, часть мотивации для Round
/ Floor
/ Ceiling
, возвращающего double
в C #, заключалась в том, чтобы избежать иллюзии ложной точности.
Альтернативное объяснение состоит в том, что модуль .NET Math
использует код, написанный на C, в котором floor и ceil возвращают типы с плавающей запятой.
Есть в документах, которые я мог найти, не было указано никаких причин. Я предполагаю, что если вы работаете с двойными числами, скорее всего, вы захотите, чтобы какие-либо операции с двойными числами возвращали двойное значение. Округление для преобразования в int было сочтено разработчиком языка менее распространенным, чем округление и сохранение как двойное.
Вы могли бы написать свой собственный метод, который преобразовал бы его в int примерно за 2 строчки кода, и это потребовало бы гораздо меньше усилий, чем публикация вопроса о переполнении стека ...