关于浮点型加减乘除运算不精确的问题
關于浮點型加減乘除運算不精確的問題
先舉一個遇到這個錯誤的項目例子:
之前做一個小模塊,由于后端接口還沒有完成,需要自己搭建node服務,返回數據,功能需求是實時更新的,這個小模塊中本人沒有使用websocket,而是使用了輪詢。
node服務關鍵代碼如下(每3秒更新一次服務端數據,數據采用增加小數的方式,也就是涉及到了浮點型的加法)
前端vue中調用數據后,發現偶爾會出現以下情況:
當時有點疑惑,搜索了很久都沒找到方法,最后是大神同事告訴我的,問題出在浮點型的運算。
只要將node服務端代碼修改以下,對浮點型長度做一下fixed就行。
重啟一下node服務(node my-server.js),然后會發現,不再出現此情況造成的bug:
那么造成浮點型運算不精確的原因是什么呢?
對于二進制小數,小數點右邊能表達的值是 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 … 1/(2^n)。所有這些小數都是一點一點的拼湊出來的一個近似的數值, 所有才會不準確的。
舉個例子, 現在用二進制來表示十進制的1.2:
1.01 = 1 + 1/4 = 1.25 , 偏大
1.001 = 1 + 1/8 = 1.125 , 偏小
1.0011 = 1 + 1/8 + 1/16 = 1.1875 , 偏小
1.001101 = 1 + 1/8+ 1/16 + 1/64 = 1.203125 , 偏大
1.0011001 = 1 + 1/8 + 1/16 + 1/128 = 1.1953125 , 偏小
1.00110011 = 1 + 1/8+1/16+1/128+1/256 = 1.19921875 , 偏小,但很接近
越來越接近……..
這就是所謂的用二進制小數沒法精確表達10進制小數的意思。
總結
以上是生活随笔為你收集整理的关于浮点型加减乘除运算不精确的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迪拜的钱叫什么 迪拜的货币是什么
- 下一篇: TypeScript初探