mac*_*loo 3 math flash actionscript actionscript-3
这是问题所在:
var p:int = 0;
var n:Number = 0;
n = 32.999999999999999;
p = Math.floor(n);
trace(p); // returns 33
n = 32.11111111111111;
p = Math.floor(n);
trace(p); // returns 32
Run Code Online (Sandbox Code Playgroud)
我希望这两个都返回32.我已经搜索过了,这似乎是AS3中未报告的错误.或者......我做错了什么?
首先,这不是一个错误!
您正在使用数字类型double- [IEEE浮点运算标准(IEEE 754)] [1].这意味着您没有确切的数字,但接近精确值的近似数字.
例如,如果要将最小可能值添加或减去数字33左右的双值尾数,则得到值:
32.999999999999986
32.99999999999999
33.0
33.00000000000001
33.000000000000014
Run Code Online (Sandbox Code Playgroud)
你的本质上是最接近33的双值可以得到的值.如果你没有发现差异,那么
32.99999999999999 // closest lower
32.999999999999999 // input value
33.0 // closest higher
Run Code Online (Sandbox Code Playgroud)
现在,32.999999999999999成为33.0当代码解释或解析为一个数字.以同样的方式,如果你打印出来32.9999999999999879得到32.999999999999986- double只是没有位来存储额外的精度,它将被替换为最接近的值.再次注意,这不是算术上最接近的,而是在标准中定义的.
推荐阅读:http://en.wikipedia.org/wiki/Machine_epsilon