为什么计算机中的小数位无法精确

https://github.com/wmui/blog/issues/1
想搞清这个问题,首先要明白十进制和二进制的转换关系
以数字43.21转换为二进制进行说明

43/2=21...1
21/2=10...1
10/2=5...0
5/2=2...1
2/2=1...0
1/2=0...1
整数部分:101011
总结:不断除以基数(2进制的基数是2),倒序取余数,110101

0.212=0.42 ...0
0.42
2=0.84 ...0
0.842=1.68 ...1
0.68
2=1.36 ...1
0.36*2=0.72 ...0
...
(一直计算到0.72为0.00停止,就会得到精确数,这也是为什么计算机在小数计算上出现误差的原因)
小数部分:0.00110
总结: 不断乘以基数,正序取整数部分进位,00110
结果:(43.21)10 约等于 (101011.0011)2

二进制转十进制
整数部分:
101011=122222+0+1222+0+12+1=43
小数部分:
0.0011=0
(1/2)+0(1/4)+1(1/8)+1*(1/16)=0.1875
结果:43.1875 (101011.0011)2 约等于 (43.21)10
总结:整数位从右至左,依次乘以2的0次方,2的一次方。小数位从左至右,以此乘以2的-1次方,2的-2次方
一图胜千言,最快的二进制转十进制方法

posted @ 2017-10-21 21:17  wmui  阅读(1602)  评论(0编辑  收藏  举报