java - Oracle 和 Java 中 double 值的区别 (IEEE 754)

标签 java oracle floating-point floating-accuracy ieee-754

Oracle 中的 BINARY_DOUBLE 和 Java 中的 Double 使用 IEEE 754 标准。

但是它们的准确性有所不同。

例如值:

456.67d

甲骨文:

declare
  a BINARY_DOUBLE := 456.67d;
begin
  SYS.DBMS_OUTPUT.PUT_Line(TO_CHAR(a,'9.99999999999999999999EEEE'));
end;

Result: 4.56670000000000020000E+02

Java:

Double d = 456.67d;
DecimalFormat formatter = new DecimalFormat("0.000000000000000000000E000");
System.out.println(formatter.format(d));

Result: 4.566700000000000000000E002

Java 中的值不如 Oracle 中的准确。

在线转换器表示 456.67d 最准确的表示是:

4.56670000000000015916157281026E2

那么为什么 Java 中的准确性与 Oracle 中的准确性不同呢? 我怎样才能在Java中获得更准确的值?

最佳答案

使用BigDecimal:

Double d = 456.67d;
BigDecimal bd = new BigDecimal( d );
bd.setScale( 50 );
System.out.println( bd );
DecimalFormat formatter = new DecimalFormat("0.000000000000000000000E000");
System.out.println( formatter.format( bd ) );

输出:

456.67000000000001591615728102624416351318359375
4.566700000000000159162E002

关于java - Oracle 和 Java 中 double 值的区别 (IEEE 754),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43539778/

相关文章:

java - macOS 上的 Eclipse 安装

sql - SQL Server 中的 "PARALLEL"等效项是什么

oracle - 忽略Oracle中的用户存在错误

c++ - 浮点 NaN 取决于 C++ 中不相关的异常处理

C++ 浮点表示

java - 如果找不到匹配项,替换会做什么? (在引擎盖下)

java - Avro GenericRecords、BigQuery 和 Beam

sql - 如何在 shell 脚本中验证更新或选择查询?

python - 将数组中的低值归零的最快方法?

java - 在 Android 中创建 ListPreferences