为什么0.1 * 3!= 0.3

时间:2011-12-22 12:58:26

标签: math

  

可能重复:
  Why can't decimal numbers be represented exactly in binary?

我正在阅读this问题,并在评论中发现了这一点(关于共产党鸭子的回答)。在确定我没有失去理智后,我发现自己很好奇。

那么为什么0.1 * 3!= 0.3?

(注意,问题是关于游戏开发以及游戏开发者应该熟悉哪些数学领域)

2 个答案:

答案 0 :(得分:4)

理由是,只有2的幂的数字才能用简单的二进制表示精确表示。

二进制数的各个数字是2的不同幂,因此任何数字都是2的不同幂的总和。

0.1不对应2的幂,不能从2的不同幂求和。因此,它只能用某个错误来表示。您可以找到更详细的解释和示例here

如果您需要精确的数字,那么您肯定会使用整数。我不确定其他语言,但在java中有几个类旨在克服这个问题,对于精度至关重要的应用程序,如财务计算。最突出的是BigIntegerBigDecimal

答案 1 :(得分:1)

这是由于IEEE 754,这是计算机存储浮点数的方式。

通过这种表示,0.1不能用96位浮点精确表示。这个问题都不能为0.3,但如果后者是,因为0.1不能准确表示,则意味着将它乘以3将不会精确地产生0.3。