JAVA浮点类型数据计算

摘要

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();
    }

你可能感兴趣的:(JAVA浮点类型数据计算)