1

在 Flash 中创建一个新的 AS3 文档,粘贴以下代码并运行它:

var a:Number=0;
trace(a)  //  0
a+=0.3;
trace(a)  //  0.3
a+=0.3;
trace(a)  //  0.6
a+=0.3;

trace(a)  //  0.8999999999999999
a+=0.3;
trace(a)  //  1.2
a+=0.3;
trace(a)  //  1.5
a+=0.3;
trace(a)  //  1.8
a+=0.3;
trace(a)  //  2.1
a+=0.3;
          //  ^ This is the output. Notice the inaccuracy starting from 0.9 / 0.89

为什么会出错?我只是在做一个普通的高分辨率加法。

任何解决方法?

4

2 回答 2

8

这是一个标准的浮点问题。二进制浮点数不能完全准确地表示十进制数的全部范围,您需要按照以下方式做一些事情

trace (round (a, 1))

或者,更好的是,把它变成一个字符串,去掉第一个小数位之后的所有内容(因为round的结果也可能不容易用二进制表示)。

虽然我不知道 ActionScript。这仍然是一个众所周知的问题,并且不仅限于 AS3。

参见例如为什么我看到一个双变量初始化为某个值,如 21.4 作为 21.399999618530273?Java 程序中奇怪的浮点行为什么是浮点/舍入错误的简单示例?.

于 2008-12-14T02:59:31.917 回答
0

一种解决方法是使用缩放的整数类型。对于此示例,您可以增加 3,然后在输出前除以 10。这避免了浮点运算中固有的所有舍入误差。

于 2008-12-14T06:08:01.333 回答