Math.floor在ActionScript 3中的行为类似于Math.round吗?

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中未报告的错误.或者......我做错了什么?

Mar*_*gus 5

首先,这不是一个错误!

您正在使用数字类型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