Math.floor在ActionScript 3中的行为如同Math.round一样吗?
这里的问题是:Math.floor在ActionScript 3中的行为如同Math.round一样吗?
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未报告的错误。或者...我做错了什么?
回答:
首先,这是不是一个错误!
您正在使用编号类型double
- [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只是没有位来存储这个额外的精度,它会被最接近的值所取代。再次注意,这不是算术上最接近的,而是因为它是在标准中定义的。
推荐阅读:http://en.wikipedia.org/wiki/Machine_epsilon
回答:
您刚刚遇到了在某种程度上困扰所有语言的现象。浮点数实际上很难用二进制表示,因此使用它们时可能会失去精度。
var p:int = 0; var n:Number = 0;
n = 32.999999999999999;
p = Math.floor(n);
trace(p); // returns 33
底层计算机读取n个为在这种情况下等于33,你尝试调用Math.floor很久以前。
欲了解更多信息,请参阅This wikipedia article about Floating Point, in the section about accuracy
回答:
正如其他人所建议的,这是不是一个错误。如果你有n = 32.999999999999996
,它将舍入到32位。如果你有n = 32.999999999999997
那么它和n = 33
一样,所以它不能实际下移。
以上是 Math.floor在ActionScript 3中的行为如同Math.round一样吗? 的全部内容, 来源链接: utcz.com/qa/260917.html