Double.MIN_VALUE - 1.0D

222
15 июня 2018, 23:50

Есть код:

System.out.println(Double.MIN_VALUE - 1.0D);

Почему его результатом будет -1.0?

Answer 1

Согласно стандарту IEEE-754 числа с точкой можно записывать в экспоненциальной форме. Этот формат дает боле-менее фиксированную точность (например, для 32бит - около 7 знаков), но в очень широком диапазоне (около +/-10 в 38 степени).

Так вот, MIN_VALUE это то минимальное, отличное от нуля, число (без учета знака), которое можно записать в этом формате (для 32бит - около 10^-38).

Соответственно, если вы берете очень малое число (Double.MIN_VALUE), и отнимаете от него единицу, то вы получите минус единицу и очень малую часть, которая будет утеряна, т.к. она не попадает в "точность" 7 знаков вокруг единицы.

То есть, грубо говоря у вас получается что-то типа -1.0000000000000000000000000000123, которое будет "округлено" и записано как -1.0000000.

Дополнительно: Почему при записи большого числа во float меняются цифры на конце?

Answer 2

Потому что в java нет нуля. Это связано с тем, что невозможно представить 2 в такой степени, чтобы был 0. Для решения это проблемы ввели MIN_VALUE. Это наиболее близкое к нулю число (а не минимальное). Более подробно можете почитать про представление чисел тут

Answer 3

Потому что Double.MIN_VALUE - это на самом деле не самое маленькое число, которое можно записать в double, а значение максимально близкое к нулю. Самое маленькое значение, которое вы можете сохранить в double является -Double.MAX_VALUE.

READ ALSO
Конфигурация log4j. java-ee

Конфигурация log4j. java-ee

вот конфигурация log4j в xml:

196
Программа для записи в файл значений без перезаписи

Программа для записи в файл значений без перезаписи

В связи с тем, что я только учусь, хочу реализовать примерно такую программу, объясните как реализовать

179
Google API не работает на Heroku

Google API не работает на Heroku

Нижеприведенный код работает только на локальном сервере, что нужно сделать что бы работало и в развернутом виде?

268