有趣的模运算结果

时间:2013-06-11 08:03:14

标签: math actionscript floating-point precision modulo

在我的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的正确余数?

1 个答案:

答案 0 :(得分:2)

31.05263157894737 * 19并非590,而是590.00000000000003

换句话说,590.00000000000003 % 31.05263157894737 = 0,但由于590稍微小一点,所以它会略微小于达到/环绕为0所需的时间。

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