Почему в Java допускается произвольная точность в двойных литералах? - PullRequest
6 голосов
/ 16 августа 2011

Я только что узнал из Поста Питера Лорейса , что это правильное выражение, и оно оценивается как true.

333333333333333.33d == 333333333333333.3d

Мой вопрос: почему разрешено иметь двойные литералы?которые не могут быть представлены в двойном, в то время как целочисленные литералы, которые не могут быть представлены, запрещены.Каково обоснование для этого решения.


Примечание: я могу фактически вызвать ошибку компиляции вне диапазона для литералов типа double: -)

99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999d

Так что, пока мы находимся в диапазоне (мин., Макс.), Литерал приближается, но при выходе за пределы этого кажется, что компилятор отказывается приближать его.

Ответы [ 2 ]

9 голосов
/ 16 августа 2011

Проблема в том, что очень немногие десятичные числа, которые вы можете ввести, могут быть представлены в точности как число с плавающей точкой IEEE. Поэтому, если вы удалите все неточные константы, вы сделаете использование двойных литералов очень громоздким. В большинстве случаев поведение «притворяемся, что мы можем это представить» гораздо более полезно.

2 голосов
/ 16 августа 2011

Основная причина, вероятно, в том, что Java просто не может определить, когда у вас заканчивается точность, потому что для этого нет кода операции процессора.

Почему нет флага процессора или аналогичного? Потому что представление числа просто не позволяет этого. Например, даже простые числа типа «0.1» не имеют определенного представления. 0.1 дает вам «00111111 10111001 10011001 10011001 10011001 10011001 10011001 10011010» (см. http://www.binaryconvert.com/result_double.html?decimal=048046049).

Это значение не точно 0,1, а 1.00000000000000005551115123126E-1.

Так что даже для этих «простых» случаев код должен был бы выдать исключение.

...