首页

通过BigDecimal解决double和float精度不准的问题

标签:java基础,BigDecimal,Double,Float,工程计算,精度问题     发布时间:2015-08-02   

一、前言

在商业计算等用例场景下,通常使用BigDecimal来进行高精度运算,而在科学或工程计算等情况下通常用float或double来进行,也就是说java的lang包下提供的常用如float、double等在高精度场景下还不能完全满足需求,所以java在math包目录下定义了BigDecimal、BigInteger等来修复这些缺陷问题。

二、代码示例

1.double或float精度问题,分别通过加、减、乘、除运行举例说明,具体如下:

public static void main(String[] args) {@b@        @b@        System.out.println(0.06+0.01);@b@        @b@        System.out.println(1.0-0.32);@b@        @b@        System.out.println(100*1.015);@b@        @b@        System.out.println(123.1/100);@b@        @b@    }

运算打印结果如下:

0.06999999999999999@b@0.6799999999999999@b@101.49999999999999@b@1.2309999999999999

2.先定义高进度运行工具类,封装引用BigDecimal实现加、减、乘、除运行,从而解决上面问题,具体如下:

import java.math.BigDecimal;@b@@b@public class MathUtil {@b@    @b@    /**设置除法默认精度值*/@b@    private static int div_scale_val=12;@b@@b@    private MathUtil() {@b@    }@b@@b@    /** 加法运算 */@b@    public static double add(double d1, double d2) {@b@        BigDecimal b1 = new BigDecimal(Double.toString(d1));@b@        BigDecimal b2 = new BigDecimal(Double.toString(d2));@b@        return b1.add(b2).doubleValue();@b@    }@b@@b@    /** 减法运算 */@b@    public static double sub(double d1, double d2) {@b@        BigDecimal b1 = new BigDecimal(Double.toString(d1));@b@        BigDecimal b2 = new BigDecimal(Double.toString(d2));@b@        return b1.subtract(b2).doubleValue();@b@    }@b@    @b@    /** 乘法运算 */@b@    public static double mul(double d1, double d2) {@b@        BigDecimal b1 = new BigDecimal(Double.toString(d1));@b@        BigDecimal b2 = new BigDecimal(Double.toString(d2));@b@        return b1.multiply(b2).doubleValue();@b@    }@b@    @b@    /** 除法运算 */@b@    public static double div(double d1, double d2) {@b@        BigDecimal b1 = new BigDecimal(Double.toString(d1));@b@        BigDecimal b2 = new BigDecimal(Double.toString(d2));@b@        return b1.divide(b2,div_scale_val,BigDecimal.ROUND_HALF_UP).doubleValue();@b@    }@b@@b@}

测试代码如下:

public static void main(String[] args) {@b@        @b@        System.out.println(MathUtil.add(0.06,0.01));@b@        @b@        System.out.println(MathUtil.sub(1.0, 0.32));@b@        @b@        System.out.println(MathUtil.mul(100, 1.015));@b@        @b@        System.out.println(MathUtil.div(123.1,100));@b@        @b@}

运行打印结果如下:

0.07@b@0.68@b@101.5@b@1.231