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

回到顶部