BigDecimal的加减乘除计算

发布于 2021-11-10  730 次阅读


首先要说一下为什么要使用BigDecimal来计算,而不直接使用+-*/

例子:

在很多编程语言中,浮点数类型float和double运算会丢失精度。
public static void main(String[] args) {
    System.out.println(0.05 + 0.01);//0.060000000000000005
    System.out.println(1.0 - 0.42);//0.5800000000000001
    System.out.println(4.015 * 100);//401.49999999999994
    System.out.println(123.3 / 100);//1.2329999999999999
    System.out.println(Math.round(4.015 * 100) / 100.0);// 4.01 四舍五入保留两位
}

在大多数情况下,float和double计算的结果是准确的,float和double只能用来做科学计算或者是工程计算,Java在商业计算中要用 java.math.BigDecimal

如果需要精确计算结果,则必须使用BigDecimal,例如价格、质量。

加减乘除

常用方法

add(BigDecimal)        BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal)     BigDecimal对象中的值相除,然后返回这个对象。
toString()                将BigDecimal对象的数值转换成字符串。
doubleValue()          将BigDecimal对象中的值以双精度数返回。
floatValue()             将BigDecimal对象中的值以单精度数返回。
longValue()             将BigDecimal对象中的值以长整数返回。
intValue()               将BigDecimal对象中的值以整数返回。

保留小数

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) 第一参数表示除数,第二个参数表示小数点后保留位数,第三个参数表示取舍规则。
@Test
    public void test2() {
        double num = 111231.5585;
        BigDecimal b = new BigDecimal(num);
        //保留2位小数
        double result = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println(result);  //111231.56
    }
ROUND_UP          //不管保留数字后面是大是小(0除外)都会进1
ROUND_DOWN        //保留设置数字,后面所有直接去除
ROUND_HALF_UP     //常用的四舍五入 
ROUND_HALF_DOWN   //五舍六入
ROUND_CEILING     //向正无穷方向舍入
ROUND_FLOOR       //向负无穷方向舍入
ROUND_HALF_EVEN   //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式 

格式化

public static void main(String[] args) {
        //建立货币格式化引用
        NumberFormat currency = NumberFormat.getCurrencyInstance();
        //建立百分比格式化引用
        NumberFormat percent = NumberFormat.getPercentInstance();
        //百分比小数点最多3位
        percent.setMaximumFractionDigits(3);
        //取整
        NumberFormat integerInstance = NumberFormat.getIntegerInstance();
        ////金额
        BigDecimal loanAmount = new BigDecimal("188.555");
        ////利率
        BigDecimal interestRate = new BigDecimal("0.018555555");
        //没有指定保留位数的情况下 默认保留2位
        System.out.println("金额: " + currency.format(loanAmount));
        //货币(百分比)格式化   指定默认的取舍规则是四舍五入
        System.out.println("利率: " + percent.format(interestRate));
        //取整还有点不一样 188.555取整为189, 188.51也是189 但是189.5确实188,所以它不是真正意义上的四舍五入
        System.out.println("取整: " + integerInstance.format(loanAmount));
    }

结果:
金额: ¥188.56
利率: 1.856%
取整: 189

欢迎欢迎~热烈欢迎~