2008-12-14 64 views
1

做一個新的AS3文件在Flash中,在下面的代碼和運行:錯誤在Flash此外

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 

爲什麼出錯?我只是在做一個普通的高分辨率添加。

任何解決方法?

回答

8

這是一個標準的浮點問題。二進制浮點數字並不能代表全範圍完全準確的十進制數字,你需要做的沿

trace (round (a, 1)) 

線的東西,或者更好的,把它變成一個字符串,並去掉一切都會過去的第一小數位(因爲循環的結果也可能不容易用二進制表示)。

雖然我不知道ActionScript。這仍然是一個非常有名的問題,不僅限於AS3。

參見例如Why do I see a double variable initialized to some value like 21.4 as 21.399999618530273?Strange floating-point behaviour in a Java programWhat is a simple example of floating point/rounding error?

0

一種解決方法是使用縮放整數類型。對於這個例子,你可以增加3,然後在輸出之前除以10。這可以避免浮點運算中固有的所有舍入錯誤。