本质上是因为计算机不能精确计算无限的数。
有的十进制小数部分转换为二进制小数部分,会无限循环,这导致了大部分小数在计算机中是不精确的。
示例:十进制的15.6转为二进制的小数 == 1111.1001 1001 1001.... 循环不尽。
下面我们来详细观察将其转换为二进制的步骤:
将十进制数转换为二进制分两部分-----整数部分转整数部分,小数部分转小数部分。
整数部分:
15转为二进制:15/2 会得到商和余数两部分,我们持续对他除2直到商为0为止,这时,自下而上,余数组合起来便是15对应的二进制。结果为1111。
小数部分:
0.6转为二进制:对该小数持续乘2,直至结果为1.0或者进入循环便可结束。
细解:
第一步:0.6 * 2 = 1.2 给其对应的二进制小数点后补1,余0.2,我们继续对它乘2。
第二步:0.2 * 2 = 0.4 给其对应的二进制小数点后补0,我们继续对它乘2。
第三步:0.4 * 2 = 0.8 给其对应的二进制小数点后补0,我们继续对它乘2。
第四步:0.8 * 2 = 1.6 给其对应的二进制小数点后补1,余0.6,我们继续对它乘2。
......
此时,我们发现已经进入了循环,又回到了刚开始的0.6,持续对它乘2......
最终,15.6这个有限的小数表示为二进制为:1111.1001 1001 1001.... 因此,大部分小数在计算机中是不精确的。