«Может, кто-нибудь подскажет, как заставить Coretto Java перейти в ненормативный, точный режим с плавающей запятой?»
Это не проблема, специфичная для Corretto.Это общая проблема Java.Простой ответ такой же, как и в других версиях OpenJDK.
Вы не можете использовать примитивные типы Java, такие как float и double.Вы должны прибегнуть к другой математической библиотеке.java.math. BigDecimal может быть хорошим началом.
jshell> import static java.math.BigDecimal.*;
jshell> var a = ONE.divide(TEN)
a ==> 0.1
jshell> var b = ONE.divide(TEN)
b ==> 0.1
jshell> a.add(b)
$16 ==> 0.2
TLDR:
Примитивные типы float и double определены в Спецификации языка Java.Java реализует определение их представления согласно IEEE 754.
4.2.3.Типы с плавающей запятой, форматы и значения Типы с плавающей запятой - это числа с плавающей запятой и двойные, которые концептуально связаны со значениями и операциями IEEE 754 32-разрядного и 64-разрядного формата одинарной точности, как указано в стандарте IEEE дляДвоичная арифметика с плавающей точкой, стандарт ANSI / IEEE 754-1985 (IEEE, Нью-Йорк).
https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.2.3
В результате ожидается следующий вывод из-за IEEEДвоичное представление 754.
jshell> double a = 0.1;
a ==> 0.1
jshell> double b = 0.1;
b ==> 0.1
jshell> double x = a*b;
x ==> 0.010000000000000002
Ссылки:
Существуют ли какие-либо стандартные реализации IEEE 754 для примитивов с плавающей запятой Java?