Хорошо ли задан режим округления больших литералов с плавающей точкой?
Рассмотрим следующий код:
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 с плавающей запятой [...]