Java浮点类型注意事项

一、浮点类型的小数存储问题

Java浮点类型注意事项

该结果是正确的,二进制无法准确的存储0.3,陷入了无限循环当中。类似的小数还很多,这是因为小数十进制转二进制的算法决定的,陷入了无线循环当中,永远是一个无限循环的值,所以在表示浮点数的时候药特意留心。

二、浮点数的有效位数和精度问题

其实无论小数还是整数在计算机系统中,有效位数都是有限的,超出有效位数的只能存储相似值,

float类型的二进制有效位是24位,对应十进制的7 ~ 8位数字

double类型的二进制53位,对应十进制的10 ~ 11位数字

Java浮点类型注意事项

从这个例子里看出123456789==123456790了,居然为true了,这是明显的精度丢失问题,

可以用Integer.toBinaryString(l).length(),查看一下二进制下的l,n,m的有效精度,int的有效精度是24位。

总结:

综上两条在做比较大的数字运算是不建议使用float,double,可以使用高精度操作类:BigInteger、BigDecimal