您的位置:首页 > 其它

double类型数据做加和操作时会丢失精度问题处理

2017-02-04 19:09 639 查看
double类型的数据做加和操作 时会丢失精度,如下操作结果为:
        int a = 3;

        double b = 0.03;

        double c = 0.03;

        double d = a + b + c;

        System.out.println("first d:" + d);

        结果:first d:3.0599999999999996

如果用java.math包中的BigDecima类并用String来构造加和操作则结果会保持正确。操作如下:

public class TestBigDecimalDemo {

    /**

     * 测试BigDecimal 在进行算数计算时不会丢失精度。--一般的数值类型在进行 金融类数据计算时会丢失精度。

     * @param args

     */

    public static void main(String[] args) {

//        double result = add(1.00000000000000001, 1.00000000000000001);

//        //result = 2.0 丢失了精度

//        System.out.println(result);

        

        int a = 3;

        double b = 0.03;

        double c = 0.03;

        //不会丢失精度

        double d = add(add(a, b),c);

        System.out.println("first d:" + d);

        //会丢失精度

        d = a+b+c;

        System.out.println("second d:" + d);

        

    }

    

     /**

     * 加法运算

     * @param m1

     * @param m2

     * @return

     */

    public static double add(double m1, double m2) {

        BigDecimal p1 = new BigDecimal(Double.toString(m1));

        BigDecimal p2 = new BigDecimal(Double.toString(m2));

        return p1.add(p2).doubleValue();

    }

    /**

     * 减法运算

     * @param m1

     * @param m2

     * @return

     */

    public static double sub(double m1, double m2) {

        BigDecimal p1 = new BigDecimal(Double.toString(m1));

        BigDecimal p2 = new BigDecimal(Double.toString(m2));

        return p1.subtract(p2).doubleValue();

    }

    /**

     * 乘法运算

     * @param m1

     * @param m2

     * @return

     */

    public static double mul(double m1, double m2) {

        BigDecimal p1 = new BigDecimal(Double.toString(m1));

        BigDecimal p2 = new BigDecimal(Double.toString(m2));

        return p1.multiply(p2).doubleValue();

    }

     /**    

      *  除法运算

      *   @param   m1  

      *   @param   m2        

      *   @param   scale      

      *   @return     

      */     

    public static double div(double m1, double m2, int scale) {

        if (scale < 0) {

            throw new IllegalArgumentException("Parameter error");

        }

        BigDecimal p1 = new BigDecimal(Double.toString(m1));

        BigDecimal p2 = new BigDecimal(Double.toString(m2));

        return p1.divide(p2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();

    }

}

输出结果为:3.06
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: