面试官:0.1+0.2=?
你:0.3?
面试官笑一笑。。。
当被问到这种问题我们应该马上想到这是在问二进制,double类型数据计算过程中的精度损失问题
首先在计算机中所有数据都是以二进制的形式存在的,十进制转二进制的方法: 整数部分除以2,逆序取余。小数部分乘以2,顺序取整。
比如:十进制数10.625
整数部分:
10 / 2 = 5
5 / 2 = 2
2 / 2=1
1 / 2=0 1小数部分:
0.625 x 2 = 1.25 1
0.25 x 2 = 0.5 0
0.5 x 2 = 1 1
结果为1010.101
再回到0.1x0.2
0.1的二进制:
0.0001100110011001100110011001100110011001100110011001101
0.2的二进制:
0.001100110011001100110011001100110011001100110011001101
二进制的指数形式
0.0001100110011001100110011001100110011001100110011001101
1.100110011001100110011001100110011001100110011001101 指数为-4
0.001100110011001100110011001100110011001100110011001101 1.100110011001100110011001100110011001100110011001101 指数为-3
再根据IEEE 754标准,取到第53位
0.1:1.1001100110011001100110011001100110011001100110011010 指数为-4
0.2:1.1001100110011001100110011001100110011001100110011010 指数为-3 这里指数不同,所以要对0.1的IEEE754进行移位
0.1:0.1100110011001100110011001100110011001100110011001101 指数为-3
0.2:1.1001100110011001100110011001100110011001100110011010
指数为-3 两数相加:10.0110011001100110011001100110011001100110011001100111 指数为-3
0.0100110011001100110011001100110011001100110011001100111
变为指数为0
把0.0100110011001100110011001100110011001100110011001100111转为十进制