Coretto Java с плавающей точкой - PullRequest
0 голосов
/ 14 февраля 2019

В Java, как правило, возникла проблема с включением арифметики с плавающей запятой и включения пронормального значения при выполнении таких операций:

double a = 0.1;
double b = 0.1;
double x = a*b;
out.println();
out.println(x);

с помощью типов float или double.

Может кто-нибудь сказать мне, как заставить Coretto Java перейти в ненормативный, точный режим с плавающей запятой?

1 Ответ

0 голосов
/ 15 февраля 2019

«Может, кто-нибудь подскажет, как заставить 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?

...