Java пытается маскировать неточную природу double-ов
От: vsb Казахстан  
Дата: 21.02.22 05:21
Оценка: 8 (3) +2 :))
Вчера Java заставила меня немножко посомневаться в своей компетентности.

Известно, что число 0.3 не представимо в двоичном виде. То, как оно представляется, на самом деле представляет число 0.299999999999999988897769753748434595763683319091796875000000 (да, я заморочился и проверил). Если написать на C++ printf("%.60f", 0.3), то именно это число и будет напечатано. Если написать printf("%.17f", 0.3), то будет напечатано число 0.29999999999999999.

Если в Java написать printf("%.17f", 0.3), то напишется 0.30000000000000000. Если "%0.60f", то будет 0.3000.... Т.е. жава тупо врёт и округляет значение до 0.3 при конвертации в строку, прежде чем выполнять финальное форматирование и округление.

Конечно понятно, что природу double-ов не скроешь такими наивными трюками и 0.1+0.2 уже выдаёт 0.30000000000000004. Слава богу, уж это не пытаются округлять. Но всё же лично у меня это всё вызвало неприятный сюрприз, т.к. пришлось потратить некоторое время, прежде чем я понял, что Java тупо занимается читингом.

Судя по всему любое число, представимое в десятичной нотации вроде 0.000123 они при toString в первую очередь переводят в подобную нотацию и потом округляют уже это десятичное число. На мой взгляд это грязный трюк, который скрывает истинную природу double-ов и провоцирует их использовать там, где их использовать не стоит, т.к. создаёт начальную видимость того, что всё работает правильно.

А вы как думаете? Может я не прав и это норма в современных языках? Лично мне ближе подход C++, который показывает математически точное значение при заданной точности.
Отредактировано 21.02.2022 5:22 vsb . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.