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

解决方法

首先,这不是一个错误

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

相关文章

  译序:JWMediaPlayer是开源的网页使用的Flash播放器。本...
    Flash编程原理都是只能将1写为0,而不能将0写成1.所...
 上传setenvgatewayip192.168.1.1;setenvserverip192.168.1...
Error:FlashDownloadFailed-"Cortex-M3"出现一般有...
jPlayer是一个用于控制和播放mp3文件的jQuery插件。它在后台...
#ifndef__FONTUPD_H__#define__FONTUPD_H__#include"sy...