Posted on

AS3.0小數運算BUG

今天處理帶錢問題時,發現AS3的Number相減的一個問題
討論串如下
http://zengrong.net/post/1186.htm
http://blog.csdn.net/bill1315/article/details/8574109

因此在撰寫程式時,

應盡量避免直接將兩個帶小數點的NUMBER做運算
而應該以整數型態做運算,運算完後再做小數點的位移

或許對一些人而言這是已知的事
但還是希望能夠分享一些自己曾遇到的錯誤以避免大家再發生相同問題~

看下面的代碼:

1
2
3
4
var n1:Number = 0.7;
var n2:Number = 0.4;
trace(n1 - n2);
//輸出 0.29999999999999993

簡單說,就是兩個一位小數相減,差為何不是一位小數?
經測試,乘法也有同樣的問題。

GOOGLE找到了Flex團隊的一個回覆:http://old.nabble.com/Float-number-calculation-in-AS3-td18447329.html

從回覆看,AS3的Number與JAVA或C++的double類似,採用二進制分數而非十進制分數保存浮點部分,因此會導致不夠精確。這是語言的設計思路所致。當然,從另一個思路看,它也是個BUG。