作為一名web開發人員,如果我們做到了涉及到費用加加減減的需求 難免會遇到浮點數的計算,就會遇到浮點數精度誤差的問題
假設場景:
1.接口給你的金額單位是分,頁面需要展示的金額單位為元。 最后落檔金額為分
2.需求可以輸入優惠金額單位為元(即 用戶可以輸入浮點數)需要計算實付金額。
問題:
第一個場景中 因為金額經歷了 從分-->元--->分的歷程。 我們實現分到元的是除以100 從分到元是用的是乘以100。 看上去毫無破綻 沒看出什么有什么邏輯問題。但是浮點數計算會有計算誤差(相關原理,我就不贅述了) 舉個例子
接口給的金額是128109分。我們做頁面展示為1281.09元(分-->元)
這個時候 我們需要將數據落檔了 需要將128109存入數據庫 我們理所當然的用 1281.09*100 (元-->分) 然后我們發現了什么?
我們再parseInt取整一下,完了,變成128108了 少了一分錢!! 為了這個問題 看代碼看到了大半夜 都沒看出來 哪里少了一分錢。原來是浮點數計算的誤差導致少了一分錢。
第二個場景會涉及到浮點數計算 那就更災難了。0.1+0.2 不等於0.3的情況 相信大家都有所耳聞。
解決辦法:
1.我個人覺得最好的解決辦法是前端不做計算。只做展示。就是說 像第一種場景 別自己寫 分-->元--->分,把項目這里取值全部直接去取接口返回的分。
2.但是我們沒辦法,前台可能會輸入浮點數,我們只能處理。這個時候我們要將浮點數轉為整數,避免掉浮點數的運算。等計算完再轉為浮點數。
這里有一個注意點,我們需要先知道我們要計算的浮點數是多少位的。然后我們將浮點數乘以大於精度值的值再去做計算。換句話說 兩位小數乘以1000,三位小數乘以10000.
再看會上面那個例子
因為我項目中只會存在兩位小數。所以 我直接乘以了1000 再除以1000
那有的項目中可能浮點數的精度並不固定。這個時候我們需要將這個浮點數變成字符串,再通過字符切割函數,將這個數變成小數和整數部分。最后獲取小數部分的長度。這樣我們就能知道要乘以多少了。
轉為整數后 在進行計算 最后別忘了再轉為浮點數