-2

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

知道为什么我会得到这个吗?

Java 环境详细信息 - java 版本“1.6.0_38”Java(TM) SE 运行时环境(构建 1.6.0_38-b05)Java HotSpot(TM) 64 位服务器 VM(构建 20.13-b02,混合模式)

有什么修复吗??

4

3 回答 3

5

不幸的是,浮点数就是这样。浮点变量可以仅在几个字节内保存令人难以置信的大范围,因此您必须权衡精度。

为什么您的号码偏离 0.0000000000000002 很重要?我真的怀疑你的精确度有那么重要。你更关心格式吗?如果是这样,请使用格式字符串

如果要确保相同的相当意外的行为在所有平台上同样有效,请使用strictfp关键字。

于 2013-10-06T04:56:16.550 回答
2

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

但是,当您执行计算时,可能会暴露此错误。这是您必须对结果进行合理舍入的时候。例如

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

印刷

1.1881
于 2013-10-06T07:34:40.947 回答
1

浮点乘法并不完美。

浮点数只有 32 位(双精度数为 64),因此它只能表示 2^32 或 2^64 状态——而不是您正在查看的范围内的实数。

因此,当您进行任何计算时,会因此而发生一些舍入。有时它比其他人更接近。碰巧最接近的浮点数1.8811.881000000000002,所以这就是你在进行计算时得到的结果,应该给你1.881

于 2013-10-06T04:56:08.913 回答