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();
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容