java - Coretto Java 浮点数
问题描述
Java 通常在以下操作中包含浮点算术非正规和非正规值包含问题:
double a = 0.1;
double b = 0.1;
double x = a*b;
out.println();
out.println(x);
通过 float 或 double 类型。
有人可以告诉我如何告诉 Coretto Java 进入非规范、准确的浮点模式吗?
解决方案
“谁能告诉我如何告诉 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
参考:
推荐阅读
- emacs - Emacs Diary 的 diary-float 查询
- sql - SQL Group By 和更改分组值
- c# - 复选框中的 asp-for 在 asp.net 核心中抛出和错误
- php - 如何在php中将新数组值添加到标头
- java - Jmeter JavaSampler - 我们可以传递已经在 Jmeter WDS 中创建的 WebDriver 实例吗?
- angular - Angular 与 CodeIgniter
- ibm-cloud - 如何将 IBM Cloud Functions 与 App ID 集成以进行身份验证?
- python - 如何在 virtualenv 中强制安装包?
- sql-server - 将 varchar 值“2018-01-01”转换为数据类型 int 时转换失败
- ajax - 413 请求实体过大码头服务器