BigDecimal的四则运算

一、介绍

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double最多可以处理16位有效数,BigDecimal一般用于对小数点有精确要求的地方,比如涉及钱的计算过程一般就不用double。 下面是介绍BigDecimal的一些基础运算。

二、BigDecimal基础

2.1 BigDecimal 变量的定义

BigDecimal bigDecimal = new BigDecimal(数值类型或者字符串类型);

  • BigDecimal bigDecimal = new BigDecimal(100);
  • BigDecimal bigDecimal = new BigDecimal("100");

2.2 四则运算

加法: add()

减法:subtract()

乘法:multiply()

除法:divide()

绝对值:abs()

具体示例代码可以看工具类。

2.3 八种小数点的取舍方式

(1) BigDecimal.ROUND_CEILING 向上进位,若当前精度位后一位数字不为0 , 则向上进位,数字更大

(2) BigDecimal.ROUND_FLOOR 向下舍位,若当前精度位后一位数字不为0 , 则向下舍位,数字更小

(3) BigDecimal.ROUND_HALF_UP 4舍5入 正数4舍5进 , 负数4舍5退,比如:

  • 1.234 == 1.23
  • 1.235 == 1.24
  • -1.234 == -1.23
  • -1.235 == -1.24

(4) BigDecimal.ROUND_HALF_DOWN 5舍6入, 和上面的 4舍5入类似, 正数5舍6进,负数5舍6退

(5) BigDecimal.ROUND_HALF_EVEN , 银行家算法,4舍6入 , 5看前数 , 奇进偶舍

  • 正数4舍6进 , 5看前一位数字 , 若为奇数则进位 , 若为偶数则舍位
  • 负数5舍6退 (-1.235 -> -1.23 ; -1.236 -> -1.24)

(6) BigDecimal.ROUND_UP 绝对值向上进位,若当前精度位后一位数字不为0 , 则绝对值向上进位,正数更大 ,负数更小

(7) BigDecimal.ROUND_DOWN , 绝对值向下舍位,若当前精度位后一位数字不为0 , 则绝对值向下舍位,正数更小 , 负数更大

(8) BigDecimal.ROUND_UNNECESSARY,不舍位,精度位数小于小数位数会抛出异常

三、自定义BigDecimal工具类

自定义的工具类主要用于double类型数据的运算,简化将double数据转为BigDecimal数据,再转回double类型数据的过程。

import java.math.BigDecimal;
public class BigDecimalUtils {

    /**
     * 加法
     * @param v1
     * @param v2
     * @return
     */
    public static double add(double v1, double v2) {
        BigDecimal bigDecimal1 = new BigDecimal(v1);
        BigDecimal bigDecimal2 = new BigDecimal(v2);
        return bigDecimal1.add(bigDecimal2).doubleValue();
    }

    /**
     * 除法
     * @param v1
     * @param v2
     * @return
     */
    public static double divide(double v1, double v2){
        if (v2 <= 0) {
            throw new ArithmeticException("被除数异常");
        }
        BigDecimal bigDecimal1 = new BigDecimal(v1);
        BigDecimal bigDecimal2 = new BigDecimal(v2);
        // 2位小数, 绝对值向上进位 
        return bigDecimal1.divide(bigDecimal2, 2, BigDecimal.ROUND_UP).doubleValue();
    }

    /**
     * 减法
     * @param v1
     * @param v2
     * @return
     */
    public static double subtract(double v1, double v2){
        BigDecimal bigDecimal1 = new BigDecimal(v1);
        BigDecimal bigDecimal2 = new BigDecimal(v2);
        return bigDecimal1.subtract(bigDecimal2).doubleValue();
    }

    /**
     * 乘法
     * @param v1
     * @param v2
     * @return
     */
    public static double multiply(double v1, double v2){
        BigDecimal bigDecimal1 = new BigDecimal(v1);
        BigDecimal bigDecimal2 = new BigDecimal(v2);
        // 2位小数, 绝对值向上进位 
        return bigDecimal1.multiply(bigDecimal2).setScale(2, BigDecimal.ROUND_UP).doubleValue();
    }
}

你可能感兴趣的:(java)