2013-02-13 35 views
1

我有變化的事件以下jQuery函數在一個文本框jQuery的 - 帶小數點的兩數相加給出錯誤的總

$('input:text[id$=txtText1]').change(GetTotal); 

這就要求GetTotal功能

function GetTotal() { 

      var value1 = txtText1.val(); 
      var value2 = txtText2.val(); 
       var sum = add(value1, value2) 

       $('input:text[id$=txtSubTotals]').val(sum); 
} 

這是附加功能

function add() { 
      var sum = 0; 
      for (var i = 0, j = arguments.length; i < j; i++) { 
       if (IsNumeric(arguments[i])) { 
        sum += parseFloat(arguments[i]); 
       } 
      } 
      return sum; 
     } 

在文本框1中,值爲1.45,在文本框2中它是1.44而不是2.89 。我得到下面的值2.8899999999999997

+2

見http://stackoverflow.com/questions/588004/is-javascripts-floating-point-math-broken – j08691 2013-02-13 21:41:36

+0

避免浮點運算 - 如果你真的需要,做「整數」數學上部分(即小數部分前和小數部分後部分)在完成後將它們放回到一起 – kinakuta 2013-02-13 21:42:50

回答

4

歡迎來到浮點數學的世界(在互聯網上有很多關於這方面的文章,但這就是javascript和其他語言中浮點數學的工作原理)。您可以閱讀許多文章中的浮點問題。這裏是one。問題是一些正常的十進制值不能用浮點格式精確表示,所以你會從你所期望的中得到很小的錯誤。

一般來說,如果您在原始數字中沒有使用大量的小數點,那麼將您的數值舍入到較小的小數點將消除差異。例如,如果你想確保得到2.89,那麼你可以將你的值舍入到一定數量的小數點,你將得到所需的答案。

你可能想改變你如何把它變成總場是這樣的:

$('input:text[id$=txtSubTotals]').val(sum.toFixed(2)); 

或者,你甚至可以使用類似6值作爲sum.toFixed(6),它仍然會解決您的問題。

如果你真的想要完美的精確度(如非常重要的財務計算),那麼有些庫不會使用浮點來獲得準確的財務數學,或者實際上可以轉換爲整數美分,並執行所有的數學運算作爲美分,並且只將小數點放回最後。