浮点型数字(俗称小数)大部分在计算机中是不精确的,主要是因为计算机的运行和计算都是以二进制进行的,而在日常生活中我们是以十进制为主来进行计算的,所以在使用计算机的时候,计算机会将我们日常的十进制数据转换成二进制才能进行使用和计算,因为这一特性,导致计算机在进行浮点型数据二进制和十进制转换的时候不那么精确,下面我以十进制浮点数转换为二进制浮点数来举例说明:
二进制与十进制之间相互转换的规则:整数部分转整数,小数部分转小数。
十进制转二进制:(以19.4为例)
整数部分:
19(十进制)=0001 0011(二进制)
小数部分:
//转换规则:小数点后面的数 × 2 得到积,若积小于1则在二进制小数部分写0,然后继续 × 2, 若积还是小于1则继续在二进制小数部分写0,如此循环直到积大于1 ,得到大于1的积之后在二进制小数部分写1,然后将整数部分去掉,继续用2乘剩下的小数部分,如此循环计算。
①0.4*2=0.8(0.8<1 二进制小数部分写0,继续计算)
0001 0011.0
②0.8*2=1.6(1.6>1 二进制小数部分写1,去掉整数部分1,小数部分0.6继续计算)
0001 0011.01
③0.6*2=1.2 (1.2>1 二进制小数部分写1,去掉整数部分1,小数部分0.2继续计算)
0001 0011.011
④0.2*2=0.4(0.4<1 二进制小数部分写0,继续计算)
0001 0011.0110
⑤0.4*2=0.8(0.8<1 二进制小数部分写0,继续计算)
0001 0011 .0110 0
写到这里不难发现,二进制的小数部分是0110,4位一直无限循环,既然是无限循环那么在运算的时候就会带来误差,从而导致大部分小数在计算机中是不精确的。
同理,既然十进制转为二进制会出现这样的问题,那么一个经过先转为二进制再转回十进制的数,它肯定是经过精确到小数点后某某位的操作的,所以转回来十进制的数肯定也不可能与原来完全相等。
(这种误差在十进制小数部分为5或者小数部分经过多次 ×2 等于5时不存在,因为0.5*2=1.0,去掉整数部分后剩余的部分为0,只需在二进制小数部分写1即可。)