在我的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的正确余数?
答案 0 :(得分:2)
31.05263157894737 * 19
并非590
,而是590.00000000000003
换句话说,590.00000000000003 % 31.05263157894737 = 0
,但由于590
稍微小一点,所以它会略微小于达到/环绕为0所需的时间。
无论哪种方式,即使您使用了源代码中的内容,因为精确数字很少会在浮点数学中给出精确结果,因为并非所有数字都可以用单/双类型精确表示,甚至微小的舍入误差也可以(如本例所示)给出相当不明显的结果。