我在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,混合模式)
任何修复?
答案 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
提供时,您获得的结果。