0

在我的 Windows 桌面上,我将两个数字相乘:

var a:Number = 31.05263157894737;
trace(a * 19) // will print '590'

很明显,590 除以a余数 0,对吧?好吧,由于某种原因,我得到了不同的结果:

trace(590 % a) // will print '31.05263'

我的问题是这是怎么发生的?为什么 1 % 0.5 给出正确的余数 0?

4

1 回答 1

2

31.05263157894737 * 19不完全590590.00000000000003

换句话说,590.00000000000003 % 31.05263157894737 = 0, 但由于590略小,它会比达到/环绕到 0 所需的略少。

无论哪种方式,即使您使用源代码中看起来精确的数字也很少会在浮点数学中为您提供精确的结果,因为并非所有数字都可以用单/双类型精确表示,甚至微小的舍入误差也可以(如这种情况)给出相当不明显的结果。

于 2013-06-11T08:16:56.597 回答