我该如何解释如下:
double o = 2.3; int i = (int) (o * 100000.0); double d = i / 100000.0; System.out.println(d);
打印2.29999
double o = 2.3; double i = o * 100000.0; double d = i / 100000.0; System.out.println(d);
打印2.3
将int除以double时,java首先将int转换为double,然后进行除法 - 如果是这样,两个代码块应该有效地打印相同的值?
似乎有一些我缺少的IEEE 754浮点精度规范和/或内联的jvm优化
double i = 2.3 * 100000.0; double d = i / 100000.0;
as double d = 2.3*100000.0/100000.0; 有效地取消了分裂并使其成为无操作.
思考?
2.3在IEEE-754 64位二进制浮点中不能完全表示.您的第一个代码序列中发生的事情是:
源文本2.3
将转换为最接近的可表示值,2.29999999999999982236431605997495353221893310546875.
将其乘以100000的确切数学结果也不能完全表示,因此它舍入到229999.99999999997089616954326629638671875.
当转换为a时int
,转换会截断,产生229999.
再分为10万轮,产生2.29999000000000020094148567295633256435394287109375.
打印上面的内容时,Java会将其显示为"2.29999".