我们先来了解一下小数在java是如何储存的
1.一个浮点数有3部分组成:符号位,指数位和尾数位。
2.float类型符号位占1位,指数部分占用8bit(1个字节)的二进制数,可表示数值范围为0-255,尾数占23位,但是因为规格化表示,小数点左边的就是最高位一定为1,最高位省去不存储,在存储中占23bit,实际有24位精度。
3.但凡学过数学就应该知道正常除法很多整数除以三都是除不尽的,在计算机中大概也是这样。
比如说0.1
把0.1转换成二进制
计算过程:
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”,“0”,“0”,“1”,“1”,“0”,“0”,“1”,“1”,“0”,“0”,“1”……
大家肯定能看出来,整数部分出现了无限循环。
这种情况计算机也没办法精确的计算了。
所以大部分小数在计算机中是没办法精确计算的。
就这样,知道是无法精确计算的就行了。
老板让你精确计算直接给他一个大嘴巴子,让他给你算一个看看。