可能重复:
Why can't decimal numbers be represented exactly in binary?为什么0.1 * 3 = 0.3
我读this问题,并在评论中发现这个(关于共产主义鸭子的答案)。确定我没有失去理智后,我发现自己好奇。
那么为什么是0.1 * 3!= 0.3?
(注意,这个问题是关于游戏开发和数学的哪些领域,游戏开发人员应该熟悉)
可能重复:
Why can't decimal numbers be represented exactly in binary?为什么0.1 * 3 = 0.3
我读this问题,并在评论中发现这个(关于共产主义鸭子的答案)。确定我没有失去理智后,我发现自己好奇。
那么为什么是0.1 * 3!= 0.3?
(注意,这个问题是关于游戏开发和数学的哪些领域,游戏开发人员应该熟悉)
疗法的原因是,只有那些2的幂数可以精确用一个简单的二进制表示表示。
一个二进制数的个别数字是2个不同的功率和任何数目因此是不同功率的2
0.1
总和不对应于2的幂,并且不能从不同总结2的幂。因此它只能用一定的误差表示。你可以找到一个更详细的解释和例子here
如果你需要精确的数字,你基本上结合使用整数。我不确定其他语言,但是在java中有几个类设计用于精确地解决这个问题,以适应精确性至关重要的应用,如财务计算。最突出的是BigInteger和BigDecimal
这是由于IEEE 754,这是计算机存储浮点数的方式。
利用该表示,0.1不能被精确地甚至由一个96位浮点数来表示。对于这个问题,0.3也不能,但如果后者是0.1,那么不能准确地表示0.1,这意味着将其乘以3不会完全产生0.3。
多个重复项,在SO问题中搜索浮点数 – sdcvvc 2011-12-22 13:01:44