为什么java中的1.09*1.09给出了1.18810000000002

为什么java中的1.09*1.09给出了1.18810000000002,java,performance,Java,Performance,我试着用1.09的Math.pow来计算平方。我得到的结果是1.18810000000002,当我尝试1.09*1.09时,结果也是一样的 知道我为什么会得到这个吗 Java环境详细信息- java版本“1.6.0_38” Java(TM)SE运行时环境(build 1.6.0_38-b05) Java HotSpot(TM)64位服务器虚拟机(构建20.13-b02,混合模式) 任何修正???浮点乘法都不是完美的 浮点数只有32位(双精度为64位),因此只有2^32或2^64位 它可以表示的状

我试着用1.09的Math.pow来计算平方。我得到的结果是1.18810000000002,当我尝试1.09*1.09时,结果也是一样的

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

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


任何修正???

浮点乘法都不是完美的

浮点数只有32位(双精度为64位),因此只有2^32或2^64位 它可以表示的状态——比你看到的范围内的实数要少

因此,当你做任何计算时,会有一些舍入,因为这会发生。有时它比其他的更接近。恰好最近的浮点
1.881
的数字是
1.8810000000002
,因此这是当您进行计算时得到的结果,应该会给出
1.881

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

为什么你的号码被关闭了0.0000000000002有什么关系?我真的怀疑你的精确性有那么重要。你更关心格式吗?如果是,请使用


如果您想确保相同而意外的行为在所有平台上都同样有效,请使用关键字。

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

但是,在执行计算时,可能会暴露此错误。此时必须对结果进行合理的舍入。e、 g

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

1.1881

签出这个类这是由于浮点数的表示,这将导致在任何本机以二进制形式存储浮点数的语言中出现这种差异。有关更多信息,请查看此处:。关于“修复”,请看这里:有一个更大的答案,我确信其他人现在正在键入涉及浮点数和尾数的内容,我正在使用JEval在运行时执行表达式,我无法设置精度。是否有一种方法可以设置方法的精度。我也尝试了strictfp,但得到了相同的结果如果需要这种精度(例如用于银行或科学目的),则必须使用BigDecimal类及其子类进行计算。或者查看你帖子评论中的StackOverflow链接