我试图将两个小数点的数字四舍五入,然后我遇到了一个奇怪的行为。
请尝试以下代码:
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应该更快)。
但如果我运行上面的代码,结果并不总是相等。
我得到了例如
而x = y / 100始终是正确的x = y * 0.01有时会在最后添加一个小值,如0.000000000000004。
我做错了吗? 还有其他人观察过这种行为吗?
答案 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.