2014-09-30 33 views
0

當我嘗試添加15分鐘然後減去5分鐘3次時,出現錯誤2.7755575615628914e-17。應該是零而不是。請幫忙。將分鐘加/減十進制的小時數

http://jsfiddle.net/3zq4napd/

$(document).on('click', '.add', function(event) { 
    var input = $('input'); 

    var inputVal = parseFloat($('input').val()); 
    var addVal = parseFloat($(this).data('num')); 
    var newVal = inputVal + (addVal/60); 

    $(input).val(newVal); 
}); 

$(document).on('click', '.sub', function(event) { 
    var input = $('input'); 

    var inputVal = parseFloat($('input').val()); 
    var subVal = parseFloat($(this).data('num')); 
    var newVal = inputVal - (subVal/60); 

    $(input).val(newVal); 
}); 
+0

的可能重複的[是浮點運算破?](http://stackoverflow.com/questions/588004。/is-floating-point-math-broken) – 2014-09-30 03:34:26

+0

你的問題源於使用浮點數學而不是日期和時間。請參閱[每個程序員...](http://floating-point-gui.de/) – 2014-09-30 03:35:39

+0

當我可以使用更簡單的方法時,我不需要使用日期和時間。 – 2014-09-30 03:50:06

回答

1

與浮點數字打交道時是正常的行爲:他們可以二進制精確表示,但不是所有的人都在小數精確表示。舍入應該有所幫助。

編輯:避免浮點錯誤的最佳方法是避免處理二進制形式不能精確表示的數字 - 即避免除2之外的任何除法。由於60不是2的功率,除以60將會爲浮點錯誤打開大門。因此,如果您可以完全在幾分鐘,幾秒鐘內或(JavaScript標準)毫秒內完成計算,則完全停留在整體土地上。因爲你的最小單位是5分鐘,這就是20/2^2,所以你仍然是二進制安全的,但是如果你用幾個小時計算(即60分鐘的塊),那麼你可以在二十分鐘的時間內計數,存在通過3進一步劃分;由於3級分不以二進制所能表述,錯誤彈出)

+0

舍入使小數中的小數值不正確。 – 2014-09-30 03:35:42

+0

無論如何這個數字都是舍入的。 '1/60'不是'1/60',它肯定不是'0.016666666666666666'(因爲實際表示是無限的)。當你想要顯示它時,你可以做的最好的事情是再次將其舍入到一定數量的數字。 – Amadan 2014-09-30 03:37:17

+0

沒錯,但是我甚至不會讓我在沒有數學錯誤的情況下做減法運算,甚至不顯示。 – 2014-09-30 03:38:21

相關問題