int和double除以双java

fo_*_*x86 0 java double ieee-754

我该如何解释如下:

    double o = 2.3;
    int i = (int) (o * 100000.0);
    double d = i / 100000.0;
    System.out.println(d);
Run Code Online (Sandbox Code Playgroud)

打印2.29999

    double o = 2.3;
    double i = o * 100000.0;
    double d = i / 100000.0;
    System.out.println(d);
Run Code Online (Sandbox Code Playgroud)

打印2.3

将int除以double时,java首先将int转换为double,然后进行除法 - 如果是这样,两个代码块应该有效地打印相同的值?

似乎有一些我缺少的IEEE 754浮点精度规范和/或内联的jvm优化

 double i = 2.3 * 100000.0;
 double d = i / 100000.0;
Run Code Online (Sandbox Code Playgroud)

as double d = 2.3*100000.0/100000.0; 有效地取消了分裂并使其成为无操作.

思考?

Eri*_*hil 10

2.3在IEEE-754 64位二进制浮点中不能完全表示.您的第一个代码序列中发生的事情是:

  • 源文本2.3将转换为最接近的可表示值,2.29999999999999982236431605997495353221893310546875.
  • 将其乘以100000的确切数学结果也不能完全表示,因此它舍入到229999.99999999997089616954326629638671875.
  • 当转换为a时int,转换会截断,产生229999.
  • 再分为10万轮,产生2.29999000000000020094148567295633256435394287109375.
  • 打印上面的内容时,Java会将其显示为"2.29999".