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