as3数字精度

时间:2012-03-27 10:13:54

标签: actionscript-3 precision

我试图将两个小数点的数字四舍五入,然后我遇到了一个奇怪的行为。

请尝试以下代码:

var num:Number  = 30.25
for (var i = 0 ; i < 100 ; i++){
    var a:Number  = (Math.round(num * 100) / 100)
    var b:Number  =  (Math.round(num * 100) * 0.01 )
    trace (num.toString() + " -- " + a.toString() + " -- " + b.toString())
    num += 0.999;
}

x = y / 100和x = y * 0.01应该相等。

(而x = y * 0.01应该更快)。

但如果我运行上面的代码,结果并不总是相等。

我得到了例如

  • 46.23400000000003 - 46.23 - 46.230000000000004 47.23300000000003 - 47.23 - 47.230000000000004 48.232000000000035 - 48.23 - 48.230000000000004 49.23100000000004 - 49.23 - 49.230000000000004

而x = y / 100始终是正确的x = y * 0.01有时会在最后添加一个小值,如0.000000000000004。

我做错了吗? 还有其他人观察过这种行为吗?

1 个答案:

答案 0 :(得分:1)

一般来说,在浮点计算中,你应该尽量避免在同一计算中出现真正不同数量的数字。这正是这些类型的问题:点“浮动”,所以你想要保持一个计算点的点接近另一个数的点。

您的问题只是作为

  

为什么4623/100 == 46.23但4623 * 0.01 == 46.230000000000004?

由于特定原因,您可以深入研究浮点计算的具体情况,例如here

4623是4.623 * 10 ^ 3而0.01是1 * 10 ^ { - 3},注意指数是如何真正不同的(6个数量级的差异)。虽然100只是1 * 10 ^ {2},但更接近4.623 * 10 ^ 3.