问题是:
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
我希望这两个都返回 32。我已经搜索过了,这似乎是 AS3 中一个未报告的错误。或者……我做错了什么?
最佳答案
首先,这不是bug!!!
您正在使用数字类型 double
- [IEEE 浮点运算标准 (IEEE 754)][1]。这意味着您没有确切的数字,而是接近确切值的近似数字。
例如,如果你想在数字 33 附近的 double 值尾数上加上或减去可能的最小值,那么你会得到值:
32.999999999999986
32.99999999999999
33.0
33.00000000000001
33.000000000000014
你基本上是 double 值可以拥有的最接近 33 的值。如果你没有发现差异,那么
32.99999999999999 // closest lower
32.999999999999999 // input value
33.0 // closest higher
现在 32.999999999999999
在 code 被解释或解析为数字时变为 33.0
。同样,如果您打印出 32.9999999999999879
,您将得到 32.999999999999986
- double 只是没有位来存储额外的精度,它将被替换为最接近的值。再次注意,这不是算术上最接近的,而是标准中定义的。
关于flash - Math.floor 是否像 ActionScript 3 中的 Math.round 一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5221332/