摘要
Java浮点数据类型在内存中存储会出现精度丢失的情况,因此涉及浮点数据类型的计算需使用BigDecimal类及相关方法。
背景
前几天遇到了一个浮点数精度处理的问题,简单地说就是把String转化为Double然后乘以精度,最后以int输出,代码如下:
public int getThreshInt(String thresh, int fractionDigits)
{
return (int) (Double.parseDouble(thresh) * Math.pow(10, fractionDigits));
}
经测试发现,当输入为1.001时,输出为1000。可见,在该方法处理的过程中出现了精度丢失问题。
分析
为了进一步明确问题所在,测试代码如下:
System.out.println(1.001 * 1);
System.out.println(1.001 * 10);
System.out.println(1.001 * 100);
System.out.println(1.001 * 1000);
System.out.println(1.001 * 10000);
输出结果为
1.001
10.009999999999998
100.1
1000.9999999999999
10009.999999999998
由此可以确定:采用基本类型进行浮点数运算会出现精度丢失的情况。
解决方法
后经查阅相关资料发现,对于上述情况需借助BigDecimal类及相应方法,正确的解决步骤为:
1.调用BigDecimal(String)将基本类型转化为BigDecimal类型;
2.采用BigDecimal的相关方法进行计算;
3.将结果转化为以期望的数据类型输出;
重写该方法,代码如下:
public int getThreshInt(String thresh, int fractionDigits)
{
return new BigDecimal(thresh).multiply(
new BigDecimal(Math.pow(10, fractionDigits))).intValue();
}
网友评论