Есть код:
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 меняются цифры на конце?
Потому что в java нет нуля. Это связано с тем, что невозможно представить 2 в такой степени, чтобы был 0. Для решения это проблемы ввели MIN_VALUE. Это наиболее близкое к нулю число (а не минимальное). Более подробно можете почитать про представление чисел тут
Потому что Double.MIN_VALUE
- это на самом деле не самое маленькое число, которое можно записать в double
, а значение максимально близкое к нулю. Самое маленькое значение, которое вы можете сохранить в double
является -Double.MAX_VALUE
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
В связи с тем, что я только учусь, хочу реализовать примерно такую программу, объясните как реализовать
Нижеприведенный код работает только на локальном сервере, что нужно сделать что бы работало и в развернутом виде?