为什么浮点型运算结果会有误差?
如var a=0.65;
var b=0.6;? ?
? ? console.log(a-b)==0.05???錯? ?a-b=0.050000000000000044
為什么?
其根本原因在于計算機所使用的01代碼無法準確地表示某些帶小數的十進制數據。
下面我們來分析下:
我們知道將一個十進制數值轉換為二進制數值,需要通過下面的計算方法:
1. 整數部分:連續用該整數除以2,取余數,然后商再除以2,直到商等于0為止。然后把得到的各個余數按相反的順序排列。簡稱"除2取余法"。
2. 小數部分:十進制小數轉換為二進制小數,采用"乘2取整,順序排列"法。用2乘以十進制小數,將得到的整數部分取出,再用2乘余下的小數部分,然后再將積的整數部分取出,如此進行,直到積中的小數部分為0或者達到所要求的精度為止。然后把取出的整數部分按順序排列起來,即先取出的整數部分作為二進制小數的高位,后取出的整數部分作為低位有效位。簡稱"乘2取整法"。
3. 含有小數的十進制數轉換成二進制,整數、小數部分分別進行轉換,然后相加。
例如:將十進制數值25.75轉換為二進制數值,步驟如下:
25(整數部分)
25/2=12......1
12/2=6.......0
6/2=3......0
3/2=1......1
1/2=0......1
(25) 10=(11001) 2
0.75(小數部分)
0.75*2=1.5......1
0.5*2=1......1
(0.75) 10=(0.11) 2
(25.75) 10=(11001) 2+(0.11) 2=(11001.11) 2
?
按照上述方法,我們將0.65及0.6轉換為二進制代碼:
(0.65)10 = (0.101001100110011001100110011001100110011......)2
(0.6) 10 = (0.10011001100110011001100110011001100110011......)2
后面的省略號表示已經算不完了,后面在無限重復 0011 這段二進制數值。
?
因為浮點型只能存儲32位,所以會進行截取,截取后的二進制代碼已無法準確表示0.65和0.6,所以無法得到正確的結果
解決方法:因為二進制數可以準確表示整數,所以可以先將小數乘10或100等變成整數,然后做運算,最后再通過除以10或100來獲得結果。
轉載于:https://www.cnblogs.com/xiaoan0705/p/11221463.html
總結
以上是生活随笔為你收集整理的为什么浮点型运算结果会有误差?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat正常启动但是访问 404
- 下一篇: 激光炸弹