关于精度计算问题!

首先看下java 处理精度问题的一个问题,如下图:

这是java处理的加减乘除的测试类,可以看出问题不正常,当我I们在计算精度问题的时候,就会出现进度丢失的问题!

看下BigDecimal处理这些加减乘除问题如下为如所示:

结果显示精度丢失更加严重,按道理来说应该不会出现这样问题,出现这个问题的原因是什么? 接下来看第三个demo如下图

这样情况就很明显了,是我们想要的结果,使用的是String的BigDecimal构造器计算结果,所以在我们选择计算金额时候一定要选择String的构造器,问题来了 为什么要选择String构造函数进行加减运算;看下源码都知到

意思是在用的时候需要将Double类型转为String类型构造器在商业用途中!

这里提供一个BigDecimal的工具类,可以省去在精度计算的时候类型间互相转换的问题(比较拙劣,仅供参考);

/**
 * Created by :Corey
 * 14:24 2019/1/2
 * BigDecimal 计算工具了
 */
public class BigDecimalUtils {

    private BigDecimalUtils() {

    }


    /**
     * 加法
     *
     * @param v1
     * @param v2
     * @return
     */
    public static BigDecimal add(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2);
    }

    /**
     * 减法
     *
     * @param v1
     * @param v2
     * @return
     */
    public static BigDecimal sub(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2);
    }

    /**
     * 乘法
     *
     * @param v1
     * @param v2
     * @return
     */
    public static BigDecimal mul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2);
    }


    /**
     * 除法
     *
     * @param v1
     * @param v2
     * @return
     */
    public static BigDecimal div(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, BigDecimal.ROUND_HALF_UP);//四舍五入
    }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值