在计算机中小数是用浮点数来表述的。
float:4字节(32位) 取值范围:-3.403E38-~3.403E38
double: 8字节(64位) 取值范围:-1.798E308·1.798E308
在计算机中计算时,计算机会先转换为二进制,然后在进行计算。
如此案例,这里的计算结果应该是0.01,但是输出结果却不是,原因是0.1在转换为二进制时计算机不会精确用二进制表现出来而是会无限接近,所以结果不会很准确
下面我们举个例子:0.1(十进制)转换为2进制:
计算过程:
0.1*2=0.2……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.8”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.6”接着计算。
0.6*2=1.2……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.8”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.6”接着计算。
0.6*2=1.2……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.2”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。
这样无限循环下去
0.1=0.000110011001100...
1100无限循环下去
所以在计算机中大部分小数都是不会精准表现出来的。