美文网首页
JAVA浮点类型数据计算

JAVA浮点类型数据计算

作者: JackWee_Yao | 来源:发表于2017-02-21 23:01 被阅读0次

    摘要

    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浮点类型数据计算

          本文链接:https://www.haomeiwen.com/subject/rghpwttx.html