[风一样的创作]BigDecimal金钱类/java计算精度问题

注意:精度问题的原因是计算机的进制转换问题导致的,BigDecimal的解决方案是把值放大,进行计算这样精度的误差就会被缩小,另外需要注意的是初始化的值如果不是整数要注意使用String类型的构造方法

 //初始化建议用字符串和整数进行入参,不然可能有精度问题
        BigDecimal decimalA = new BigDecimal("100");
        BigDecimal decimalB = new BigDecimal("20");
        BigDecimal decimalC = new BigDecimal("100.123456");

        //正常相加
        BigDecimal decimalD = decimalA.add(decimalB);
        //相加并且设置保留位,包含整数和小数,四舍五入
        BigDecimal decimalE = decimalA.add(decimalB, new MathContext(2));

        //正常相减
        BigDecimal decimalF = decimalA.subtract(decimalB);
        //相减并且设置保留位,包含整数和小数,四舍五入
        BigDecimal decimalG = decimalA.subtract(decimalB, new MathContext(2));

        //正常相乘
        BigDecimal decimalQ = decimalA.multiply(decimalB);
        //相乘并且设置保留位,包含整数和小数,四舍五入
        BigDecimal decimalW = decimalA.multiply(decimalB, new MathContext(2));

        //正常相除,如果碰见除不尽的会抛异常
        BigDecimal decimalR = decimalA.divide(decimalB);
        //相除并且设置保留位,包含整数和小数,四舍五入
        BigDecimal decimalT = decimalA.divide(decimalB, new MathContext(4));
        //相除并且必须四舍五入掉最后两位非零的小数,可以选择四舍五入的规则,如果只有二位则只四舍五入一位,最少保证一位不为0的小数
        BigDecimal decimalY = decimalA.divide(decimalB, 2);
        //相除并且这个同上,只是换成了变量名
        BigDecimal decimalU = decimalA.divide(decimalB, RoundingMode.UP);
        //相除并且指定保留小数的位数,不够补0,可以设置四舍五入规则
        BigDecimal decimalI = decimalA.divide(decimalB, 2, 0);
        //相除并且这个同上,只是换成了变量名,RoundingMode也可以用BigDecimal
        BigDecimal decimalO = decimalA.divide(decimalB, 2, RoundingMode.UP);

        //单独指定保留小数位,只能去掉尾部的 0 或者增加 0,如果去非0的会报精度丢失异常
        BigDecimal decimalP=decimalR.setScale(10);
        //单独指定保留小数的位数,不够补0,可以设置四舍五入规则
        BigDecimal decimalS=decimalR.setScale(1, 0);
        //单独这个同上,只是换成了变量名,RoundingMode也可以用BigDecimal
        BigDecimal decimalH=decimalR.setScale(1, RoundingMode.UP);

        //相除得到最大整除数以后的多余的数,如 100.12 -(100.12 / 20)*20
        BigDecimal decimalJ=decimalA.remainder(decimalB);
        //同上,多了个设置保留位,包含整数和小数,四舍五入
        BigDecimal decimalK=decimalA.remainder(decimalB,new MathContext(1));

        //相除得到最大整除数,如100.12 / 20
        BigDecimal decimalL=decimalA.divideToIntegralValue(decimalB);
        //同上,多了个设置保留位,包含整数和小数,四舍五入
        BigDecimal decimalZ=decimalA.divideToIntegralValue(decimalB,new MathContext(1));

        //相除得到最大整除数和除完多余的数,比如100.12 / 20 得到 5 和 0.12,反推就是N[0]*decimalB+N[1]
        BigDecimal[] decimalsA=decimalA.divideAndRemainder(decimalB);
        //同上,多了个控制整除数保留位的,四舍五入
        BigDecimal[] decimalsB=decimalA.divideAndRemainder(decimalB,new MathContext(1));

        //两个值比较,返回大的值
        BigDecimal decimalX=decimalA.max(decimalB);
        //两个值比较,返回小的值
        BigDecimal decimalV=decimalA.min(decimalB);
        //比较两个值是否一样相等
        boolean type=decimalA.equals(decimalC);
        //两个值比较,第一个值小于第二个返回-1,等于返回0 ,大于返回1
        int size=decimalA.compareTo(decimalB);

        //获取当前对象的值
        BigDecimal decimalN=decimalA.abs();
        BigDecimal decimalNS=decimalA.plus();
        //获取当前对象值的缩写 就是加上 E
        BigDecimal decimalHH=decimalA.stripTrailingZeros();
        //获取完整值
        BigDecimal decimalLL=decimalA.scaleByPowerOfTen(0);
        //获取当前对象去了小数点的整数值,只拿可见的值,忽略 E
        BigInteger bigIntegerA=decimalA.unscaledValue();
        //获取当前对象去了小数点的整数值,不忽略 E
        BigInteger bigIntegerB=decimalA.toBigIntegerExact();
        //同上,多了个设置保留位,包含整数和小数,四舍五入
        BigDecimal decimalM=decimalA.abs(new MathContext(4));
        BigDecimal decimalMS=decimalA.plus(new MathContext(4));
        BigDecimal decimalRO=decimalA.round(new MathContext(9));
        //获取当前对象的值,String类型,三个的区别就是后面两个会用幂等这种科学计数法省略长度
        String sdecimalA=decimalA.toPlainString();
        String sdecimalB=decimalA.toEngineeringString();
        String sdecimalC=decimalA.toString();

        //获取当前对象值的反方向值,比如当前值是 100 取出来的就是 -100
        BigDecimal decimalAA=decimalA.negate();
        //同上,多了个设置保留位,包含整数和小数,四舍五入
        BigDecimal decimalBB=decimalA.negate(new MathContext(4));

        //向左移动指定位数小数点
        BigDecimal decimalCC=decimalA.movePointLeft(1);
        //向右移动指定位数小数点
        BigDecimal decimalDD=decimalA.movePointRight(1);

        //幂等计算,比如 100.pow(3)  就是100*100*100,幂是几,就几个值一次一次相乘
        BigDecimal decimalEE=decimalA.pow(3);
        //如上,多了个设置保留位,包含整数和小数,四舍五入
        BigDecimal decimalFF=decimalA.pow(2,new MathContext(4));

        //获取当前对象值的精度(数字长度,不包含小数点)
        int precisionA=decimalA.precision();
        //获取当前对象值小数点右边的精度(小数长度)
        int precisionB=decimalA.scale();
        //获取当前对象值的最小精度,比如 值为100 结果就是1  如果带小数比如 1.12  就是0.01
        BigDecimal decimalGG=decimalA.ulp();



        int decimalJJ=decimalA.signum();

        int i = 0;

如果喜欢请点赞关注收藏,我是风一样,用心写代码的家伙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风一样的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值