我在 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,混合模式)
有什么修复吗??
我在 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,混合模式)
有什么修复吗??
Math.pow 非常慢,所以除非你必须,否则我不会使用它。浮点数不能准确表示大多数十进制数。相反,它们存储最近的可表示值。当您打印此值时,它假定您想要具有此表示的最短小数,即它隐藏了错误。
但是,当您执行计算时,可能会暴露此错误。这是您必须对结果进行合理舍入的时候。例如
double d = 1.09;
System.out.printf("%.4f%n", d * d);
印刷
1.1881
浮点乘法并不完美。
浮点数只有 32 位(双精度数为 64),因此它只能表示 2^32 或 2^64 状态——而不是您正在查看的范围内的实数。
因此,当您进行任何计算时,会因此而发生一些舍入。有时它比其他人更接近。碰巧最接近的浮点数1.881
是1.881000000000002
,所以这就是你在进行计算时得到的结果,应该给你1.881
。