为什么java中的1.09 * 1.09给出1.1881000000000002

时间:2013-10-06 04:49:45

标签: java performance

我在1.09上尝试Math.pow来计算平方。结果我获得了1.1881000000000002,当我尝试1.09 * 1.09时,它也给出了相同的结果。

知道我为什么会这样做吗?

Java env详情 - java版“1.6.0_38” Java(TM)SE运行时环境(版本1.6.0_38-b05) Java HotSpot(TM)64位服务器VM(内置20.13-b02,混合模式)

任何修复?

3 个答案:

答案 0 :(得分:5)

遗憾的是,浮点数是多少。浮点变量只能在几个字节内保存一个令人难以置信的大范围,因此您必须权衡精度。

为什么您的号码被.0000000000000002关闭?我真的怀疑你的精确度非常重要。你更关心格式吗?如果是,请使用format strings

如果您想确保相同的意外行为在所有平台上同等运作,请使用strictfp关键字。

答案 1 :(得分:2)

Math.pow非常慢,所以除非必须,否则我不会使用它。浮点不能准确表示大多数十进制数。相反,它们存储最近的可表示值。当您打印此值时,它假定您需要具有此表示的最短小数,即它隐藏错误。

但是,执行计算时,可能会暴露此错误。这是您必须对结果应用合理的舍入。 e.g。

double d = 1.09;
System.out.printf("%.4f%n", d * d);

打印

1.1881

答案 2 :(得分:1)

浮点乘法并不完美。

浮点数仅为32位(双精度为64),因此只有2 ^ 32或2 ^ 64 说它可以代表 - 比你正在看的范围内的实数更少。

因此,当你进行任何计算时,由于这个原因,会发生一些舍入。有时它比其他人更接近。它恰好发生在最近的浮点上 1.881的数字为1.881000000000002,因此,当您执行的计算应该为1.881提供时,您获得的结果。