js處理浮點數一點思考


作為一名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

那有的項目中可能浮點數的精度並不固定。這個時候我們需要將這個浮點數變成字符串,再通過字符切割函數,將這個數變成小數和整數部分。最后獲取小數部分的長度。這樣我們就能知道要乘以多少了。

 

 

 

 轉為整數后 在進行計算 最后別忘了再轉為浮點數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM