JAVA中浮点数使用注意事项

需要精确计算时不要使用float和double

说明:浮点数在一个范围很广的值域上提供了很好的近似,但是它不能产生精确的结果。二进制浮点数对于精确计算是非常不适合的,因为它不可能将0.1,或者10的其它任何负次幂表示为一个长度有限的二进制小数。涉及精确的数值计算(货币、金融等),建议使用int, long, BigDecimal等
示例:
不好:以下输出结果是0.6100000000000001

System.out.println(1.03 - 0.42);

推荐:需要精确计算时

BigDecimal income = new BigDecimal("1.03");
BigDecimal expense = new BigDecimal("0.42");
System.out.println(income.subtract(expense));

不能用浮点数作为循环变量

说明:浮点数不能为循环因子,精度问题会导致 (float)2000000000 == 2000000050为true,所以如下的循环不会执行。

for (float f = (float) 2000000000; f < 2000000050; f++) {
    ...
}

浮点型数据判断相等不能直接使用

说明:由于浮点数在计算机表示中存在精度的问题,因此,判断2个浮点数相等不能直接使用等号可以采用如下方式:

float a =...;
float b =...;
if (Math.abs(a-b) < 1E-6f) {
      ...
} 

其中1E-6f为一个float极小值,实际使用时请根据情况判断精度,并且提取常量。 如果是double,请使用1E-6。

你可能感兴趣的:(java)