这是问题所在:
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
解决方法
首先,这不是一个错误!
您正在使用数字类型双 – [IEEE浮点运算标准(IEEE 754)] [1].这意味着您没有确切的数字,但接近精确值的近似数字.
例如,如果要将最小可能值添加或减去数字33左右的双值尾数,则得到值:
32.999999999999986 32.99999999999999 33.0 33.00000000000001 33.000000000000014
你的本质上是最接近33的双值可以得到的值.如果你没有发现差异,那么
32.99999999999999 // closest lower 32.999999999999999 // input value 33.0 // closest higher
现在,当代码被解释或解析为数字时,32.999999999999999变为33.0.以同样的方式,如果您打印出32.9999999999999879,您将得到32.999999999999986 – double只是没有用于存储该额外精度的位,并且它将被替换为最接近的值.再次注意,这不是算术上最接近的,而是在标准中定义的.