【发布时间】:2014-01-08 19:34:06
【问题描述】:
我该如何解释以下内容:
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;
作为 双 d = 2.3 * 100000.0 / 100000.0; 有效地取消了分裂并使其成为无操作。
想法?
【问题讨论】:
-
这是已知的二进制操作级别问题。这就是为什么当您比较一些
double值时,您不得使用 ==,而是使用特殊的Compare方法和精度设置 -
@ElliotTereschuk:问题中没有
==操作,并且“二进制操作级别”不是浮点中常用的术语。 -
@EricPostpischil 使用 == 进行简单检查显然会在 2.29999 == 2.3 上返回
false,这是非常常见的错误。此评论是建议使用舍入和Double.Compare -
@ElliotTereschuk:问题不是问为什么比较会返回意外结果;它询问为什么两个结果不同。关于比较的评论与这个问题无关。