遇到一个double类型精度丢失的问题,问题如下:同一个浮点数a,加一个整数b,a+b精度不变,a+b+b精度会发生变化。
double a=1206.11;
int b=555;
System.out.println(a+b);//得到的结果为1761.11
System.out.println(a+b+b);//得到的结果为2316.1099999999997
1、搜了double类型在内存中的保存方式,所占内存为16字节,所以整数和小数所占内存之和是不变的。
2、当整数部分位数增加,则小数位数就会减少。
3、对比两次结果的整数部分:1761的二进制表示为11011100001,所占位数为11位;2361的二进制表示为100100001100,所占位数是12位。
4、所以第二次计算结果的小数位数会减少,刚好减小的位数上的值为1。就出现了这种现象。
备注:当小数点有效位数的最后一位为5时,不会出现精度误差。例如11.5,12.00005等