2013-08-02 107 views
2

我開始有小數的問題,這讓我瞭解了整個浮點數學。我的問題是,它有什麼可行的解決方案?解決Javascript的浮點算術問題

x = 0.1; 
y = 0.2; 
num = x + y; 
num = Math.round(num * 100)/100; 

x = 0.1; 
y = 0.2; 
num = x + y; 
num = num.toFixed(2); 
num = Number(num); 

難道這些均爲100%可行的選擇?如同以後,再也不用擔心會有同樣的問題了嗎?你會推薦哪一個?或者你會推薦一個不同的解決方案?有什麼理由相互使用一種解決方案?預先感謝您的幫助。編輯: 對不起,我不是更具體。我很好,總是2位小數,因爲這對我的項目不會有問題。顯然,如果你想要更多的小數,你會使用1000而不是100和toFixed(3)等等。我主要關心的是,上述兩種解決方案100%是否可行,因爲我不需要擔心任何相同的問題?而且,你會推薦第一個解決方案還是第二個解決方案?還是另一個呢?因爲我會在很多計算中使用相當多的方法。再次感謝你的幫助。

+5

取決於你想解決什麼問題 – Chad

+0

什麼是你最初的問題? – federicot

+1

可能的重複:[JavaScript的浮點數學破碎?](http://stackoverflow.com/questions/588004/is-javascripts-floating-point-math-broken) –

回答

2

這不是JavaScript的浮點實現問題,或者如果您使用字符串格式化函數(例如toFixed(the MDN docs for it here明確表示它是返回的字符串表示形式,而不是某種其他格式的數字)將會消失。相反,這是浮點運算的一個固有屬性,作爲概念 - 它具有可變的精確度,旨在將值接近於某個範圍內的值。

如果您希望您的值始終完全準確,唯一的解決方案不是使用浮點數。通常,這是通過使用整數來表示的,這些整數代表您正在處理的「整體」數字的一小部分(例如,便士/美分而不是磅/歐元/美元,或毫秒而不是秒)。或者,您可以找到一個執行定點算術的精確數學庫,以避免不準確但性能更差。

如果你不介意不準確的風險慢慢建立,你可以簡單地使用格式化功能只顯示一定精度當你計算的輸出結果。轉換爲具有固定精度的字符串然後回到數字是沒有意義的,因爲浮點實現可能仍然無法完全精確地表示該數字。