2014-05-19 77 views
1

我有一個數值輸入,其步伐爲0.01,Knockout「監視」並且Knockout.validation插件也檢查該值。Knockout.Validation中的浮點舍入錯誤

當測試輸入以確保它提供了適當的錯誤消息時,我發現某些輸入將導致驗證消息。例如,值-0.14將導致錯誤:「該值必須增加0.01」。

有問題的Knockout.Validation代碼是:

return utils.isEmptyVal(val) || (val * 100) % (step * 100) === 0; 

對於val = -0.14step = 0.01,浮點運算引起這行返回false,這意味着Knockout.Validation看到-0.14作爲無效輸入。這只是一個例子,有很多情況發生。對於-0.14的情況,(val * 100) % (step * 100)的結果爲-1.7763568394002505e-15

有沒有簡單的方法,我可以修補此代碼?請問下列任何情況下都足夠了:

return utils.isEmptyVal(val) || parseInt(val * 100) % parseInt(step * 100) === 0; 

或者我應該有一個範圍檢查?

+0

你的修復也會允許'step = 0.011'。那是問題嗎? – usr2564301

+0

該步驟不會改變,我相信Knockout.Validation之前不支持超過2個小數位(通過查看代碼)。 – Ivan

+1

您是否獲得了浮點錯誤的值?對照合理的* epsilon *進行測試可能就足夠了:'Math.abs((val * 100)%(step * 100))<0.000001'(或其附近)。它需要「abs」,因爲你的論點可能是負面的。 – usr2564301

回答

0

在類似的情況下,我找到this issue中的代碼修復了我的問題。

問題中的核心代碼看起來與您提出的解決方案非常相似,但我認爲有充分的理由使用parseFloat而不是parseInt。