2009-10-20 32 views
1

嘿,所有,讓我們直接跳到代碼示例,以顯示ECMAScript/JavaScript/AS3如何不能做簡單的數學計算(AS3爲Number類使用'IEEE-754雙精度浮點數'與JavaScript中使用的相同)...爲什麼我在ECMAScript/ActionScript 3中看到不精確的浮點結果?

trace(1.1);   //'1.1': Ok, fine, looks good. 
trace(1.1*100);  //'110.00000000000001': What!? 
trace((1.1*100)/100); //'1.1': Brings it back to 1.1 (since we're apparently multiplying by *approximately* 100 and then dividing by the same *approximate* '100' amount) 
trace(1.1*100-110); //'1.4210854715202004e-14': Proof that according to AS3, 1.1*100!=110 (i.e. this isn't just a bug in Number.toString()) 
trace(1.1*100==110); //'false': Even further proof that according to AS3, 1.1*100!=110 

什麼給出了?

+1

的100的第三行*是*確切。這是近似的1.1(沒有用二進制表示1/10的有限方式)。 「痕跡(1.1)」的原因是正確的,因爲它確切地說是足夠的小數位。乘以100只會將錯誤轉移到打印的部分。 – 2009-10-20 21:13:00

回答

9

歡迎的floating point calculation accuracy的精彩世界。一般來說,浮點計算會給你非常非常接近正確的結果,但比較絕對平等的輸出結果不會給你預期的結果而不使用舍入函數。

2

這只是使用浮點數的副作用 - 這些是十進制數的二進制表示,總會有一些近似值。

Long explanation

2

浮點不一致是許多語言中已知的問題。這是因爲計算機不是用來處理浮點數的。

Have fun

2

隨着月影狀態,你正在運行與浮點精度的問題。浮點數不適合以您期望的方式在十進制值表示和執行算術的任務。當人們嘗試使用浮點數進行財務計算時,這類問題最常出現。維基百科條目很好,但是您可能會從這個頁面中獲得更多信息,這可以通過容易出錯的財務計算來實現:http://c2.com/cgi/wiki?FloatingPointCurrency

要準確處理十進制數字,您需要一個小數點庫。我已經概述寫在可能適合在另一個SO後您的需求的JavaScript度的兩個BigDecimal樣式庫,希望你會發現它們非常有用:

https://stackoverflow.com/questions/744099/javascript-bigdecimal-library/1575569

相關問題