首页 > 解决方案 > Coretto Java 浮点数

问题描述

Java 通常在以下操作中包含浮点算术非正规和非正规值包含问题:

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

通过 float 或 double 类型。

有人可以告诉我如何告诉 Coretto Java 进入非规范、准确的浮点模式吗?

标签: javacorretto

解决方案


“谁能告诉我如何告诉 Coretto Java 进入非反规范、精确的浮点模式?”</p>

这不是 Corretto 特有的问题。这是一个一般的Java问题。简单的答案与您在其他版本的 OpenJDK 中执行此操作的方式相同。

您不能使用浮点和双精度等 Java 原始类型。您必须求助于另一个数学库。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。浮点类型、格式和值 浮点类型是 float 和 double,它们在概念上与 IEEE 标准中指定的单精度 32 位和双精度 64 位格式 IEEE 754 值和操作相关联二进制浮点运算,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

参考:

Java 浮点原语是否有任何 IEEE 754 标准实现?


推荐阅读