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

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

例如值:


  456.67天


甲骨文:

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



  结果:4.56670000000000020000E + 02


Java:

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



  结果: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

07-24 09:45
查看更多