Хорошо ли задан режим округления больших литералов с плавающей точкой?

Рассмотрим следующий код:

System.out.printf("%f%n", 123456796f);

Это печатает 123456800 в моей системе, таким образом, значение было округлено до 4. Является ли округление обязательным в этой ситуации, или же компилятор решил также округлить до 4, что приводит к 123456792?

1 ответ

Решение

Спецификация языка Java, §3.10.2, Литералы с плавающей точкой:

Подробности правильного преобразования входных данных из строкового представления Unicode числа с плавающей запятой во внутреннее двоичное представление IEEE 754 с плавающей запятой описаны для методов. valueOf класса Float и класс Double пакета java.lang,

Float.valueOf Javadoc:

s считается представлением точного десятичного значения в обычной "компьютеризированной научной нотации" или точным шестнадцатеричным значением; это точное числовое значение затем концептуально преобразуется в "бесконечно точное" двоичное значение, которое затем округляется до типа float по обычному правилу округления до ближайшего арифметики IEEE 754 с плавающей запятой [...]

Другие вопросы по тегам