浮点数为什么不精确?

其实这句话本身就不精确, 相对精确一点的说法是: 我们在程序里写的 10 进制小数,计算机内部无法用二进制的小数来精确的表达。

因为二进制只能表示 2 的 n 次方的数,n 可以取负值,3.3 无法用 2 的 n 次方的数组合计算出来,所以无法精确表示:
3.3 = 1*2+1*1+0*1/2+1*1/4+0*1/8+0*1/16+1*1/32+…
(解释:2+1=3,3+1/2>3.3 所以系数是 0)
其中分式的分母只能是 2 的倍数(二进制所限),3.3 的二进制表示是 11.01001…
有些数比如 1/3 就无法精确计算,只能无限逼近

再比如表达十进制的 0.2
0.01 = 1/4 = 0.25 ,太大
0.001 =1/8 = 0.125 , 又太小
0.0011 = 1/8 + 1/16 = 0.1875 , 逼近0.2了
0.00111 = 1/8 + 1/16 + 1/32 = 0.21875 , 又大了
0.001101 = 1/8+ 1/16 + 1/64 = 0.203125 还是大
0.0011001 = 1/8 + 1/16 + 1/128 = 0.1953125 这结果不错
0.00110011 = 1/8+1/16+1/128+1/256 = 0.19921875
已经很逼近了, 就这样吧。

08-21 04:49