在Flash中创建一个新的AS3文档,粘贴以下代码并运行它:
var a:Number=0; trace(a) // 0 a+=0.3; trace(a) // 0.3 a+=0.3; trace(a) // 0.6 a+=0.3; trace(a) // 0.8999999999999999 a+=0.3; trace(a) // 1.2 a+=0.3; trace(a) // 1.5 a+=0.3; trace(a) // 1.8 a+=0.3; trace(a) // 2.1 a+=0.3; // ^ This is the output. Notice the inaccuracy starting from 0.9 / 0.89
为什么错误?我只是做一个普通的高分辨率加法.
任何解决方法?
这是一个标准的浮点问题.二进制浮点数不能代表完整精度的十进制数范围,你需要做一些事情
trace (round (a, 1))
或者,更好的是,将它变成一个字符串并剥离超过第一个小数位的所有内容(因为舍入的结果也可能不容易用二进制表示).
虽然我不知道ActionScript.它仍然是一个众所周知的问题,并不仅限于AS3.
参见例如为什么我看到一个双变量初始化为某个值,如21.4为21.399999618530273?或Java程序中的奇怪浮点行为或浮点/舍入错误的简单示例是什么?.