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

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



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值