Есть код:
System.out.println(Double.MIN_VALUE - 1.0D);
Почему его результатом будет -1.0?
Есть код:
System.out.println(Double.MIN_VALUE - 1.0D);
Почему его результатом будет -1.0?
Согласно стандарту IEEE-754 числа с точкой можно записывать в экспоненциальной форме. Этот формат дает боле-менее фиксированную точность (например, для 32бит - около 7 знаков), но в очень широком диапазоне (около +/-10 в 38 степени).
Так вот, MIN_VALUE это то минимальное, отличное от нуля, число (без учета знака), которое можно записать в этом формате (для 32бит - около 10^-38).
Соответственно, если вы берете очень малое число (Double.MIN_VALUE), и отнимаете от него единицу, то вы получите минус единицу и очень малую часть, которая будет утеряна, т.к. она не попадает в "точность" 7 знаков вокруг единицы.
То есть, грубо говоря у вас получается что-то типа -1.0000000000000000000000000000123, которое будет "округлено" и записано как -1.0000000.
Дополнительно: Почему при записи большого числа во float меняются цифры на конце?
Потому что Double.MIN_VALUE - это на самом деле не самое маленькое число, которое можно записать в double, а значение максимально близкое к нулю. Самое маленькое значение, которое вы можете сохранить в double является -Double.MAX_VALUE.
Потому что в java нет нуля. Это связано с тем, что невозможно представить 2 в такой степени, чтобы был 0. Для решения это проблемы ввели MIN_VALUE. Это наиболее близкое к нулю число (а не минимальное). Более подробно можете почитать про представление чисел тут