Java中BigDecimal的常用方法

448 阅读5分钟

Java中BigDecimal的用法

一、常用静态枚举值

常用枚举值

1、BigDecimal.ZERO == 0
2、BigDecimal.ONE == 1
3、BigDecimal.TEN == 10

BIgDecimal舍入方式枚举值(BIgDecimal)

1、BigDecimal.ROUND_UP == 0 // 无论正负,当小数位有值、并且大于0,正数向正无穷进1,负数向负无穷进1(与第二条相反)
例:
	值:1.2  舍入结果:2
	值:2.1  舍入结果:3
	值:3.0  舍入结果:3
	值:-1.2 舍入结果:-2 
2、BigDecimal.ROUND_DOWN == 1 // 无论正负,当小数位有值、并且大于0,正数向01,负数向01(与第一条相反)
例:
	值:1.9  舍入结果:1
	值:2.8  舍入结果:2
	值:3.0  舍入结果:3
	值:-1.2 舍入结果:-1
3、BigDecimal.ROUND_CEILING == 2 // 无论正负,当小数位有值、并且大于0,向比自身大的方向进1(与第四条相反)
例:
	值:2.1  舍入结果:3
	值:3.1  舍入结果:4
	值:4.0  舍入结果:4
	值:-1.9 舍入结果:-1
4、BigDecimal.ROUND_FLOOR == 3 // 无论正负,当小数位有值、并且大于0,向比自身小的方向进1(与第三条相反)
例:	
	值:2.9  舍入结果:2
	值:3.9  舍入结果:3
	值:4.0  舍入结果:4
	值:-1.1 舍入结果:-2
5、BigDecimal.ROUND_HALF_UP == 4 // 经典四舍五入(小学必学那个)
例:	
	值:2.4  舍入结果:2
	值:2.5  舍入结果:3
	值:4.0  舍入结果:4
	值:-1.1 舍入结果:-1
6、BigDecimal.ROUND_HALF_DOWN == 5 // 五舍六入 和四舍五入的区别:就是:值小于等于5舍去,大于等于6进位
例:	
	值:2.5  舍入结果:2
	值:2.6  舍入结果:3
	值:4.0  舍入结果:4
	值:-1.5 舍入结果:-1
7、BigDecimal.ROUND_HALF_EVEN == 6 // 银行家舍入法 “四舍六入五成双”,也即“465凑偶”,这里“四”是指≤4时舍去,"六"是指≥6时进上。"五"指的是根据5后面的数字来定,当5后有数时,舍51;当5后无有效数字时,需要分两种情况来讲:5前为奇数,舍515前为偶数,舍5不进
	值:5.5  舍入结果:6
	值:2.5  舍入结果:2
	值:4.0  舍入结果:4
	值:-1.5 舍入结果:-2
	值:-2.5 舍入结果:-2
8、BigDecimal.ROUND_UNNECESSARY == 7 // **不进行取舍,如果强行取舍或精度不准确抛出异常java.lang.ArithmeticException**

RoundingMode舍入方式枚举值(官方推荐使用)

1、RoundingMode.UP 用法以及舍入方式和上述的BigDecimal.ROUND_UP一致
2、RoundingMode.DOWN 用法以及舍入方式和上述的BigDecimal.ROUND_DOWN一致
3、RoundingMode.CEILING 用法以及舍入方式和上述的BigDecimal.ROUND_CEILING一致
4、RoundingMode.FLOOR 用法以及舍入方式和上述的BigDecimal.ROUND_FLOOR一致
5、RoundingMode.HALF_UP 用法以及舍入方式和上述的BigDecimal.ROUND_HALF_UP一致
6、RoundingMode.HALF_DOWN 用法以及舍入方式和上述的BigDecimal.ROUND_HALF_DOWN一致
7、RoundingMode.HALF_EVEN 用法以及舍入方式和上述的BigDecimal.ROUND_HALF_EVEN一致
8、RoundingMode.UNNECESSARY 用法以及舍入方式和上述的BigDecimal.ROUND_UNNECESSARY一致

二、创建BIgDecimal对象的常用方法

1、通过构造方法进行创建

	// 通过字符数组创建
	char[] chars ={'1','2','3','.','3','4','5'};
        BigDecimal bigDecimal = new BigDecimal(chars); // 123.345
        // 通过double类型进行创建(存在问题容易丢失精度)
        double d = 2.34;
        BigDecimal bigDecimal = new BigDecimal(d); // 2.339999999999999857891452847979962825775146484375
        // 通过int类型进行创建
        int num = 100;
        BigDecimal bigDecimal = new BigDecimal(num); // 100
        // 通过long类型进行创建
        long l = 10200230;
        BigDecimal bigDecimal = new BigDecimal(l); // 10200230
        // 通过String类型进行创建
        String str ="123.4343";
        BigDecimal bigDecimal = new BigDecimal(str); // 123.4343

2、通过BigDecimal.valueOf进行创建

    // long类型参数 
    long l = 10200230;
    BigDecimal bigDecimal = BigDecimal.valueOf(l); // 10200230
    // double类型参数
    double d = 4.353;
    BigDecimal bigDecimal = BigDecimal.valueOf(d); // 4.353

其实BigDecimal.valueOf的底层也是调用其指定的构造方法

参数为double类型的valueOf方法底层代码 BIgDecimal的底层方法 参数为long类型的valueOf方法底层代码 在这里插入图片描述

三、BIgDecimal进行比较的常用方式

1、使用equals()方法进行比较

	BigDecimal bigDecimal = new BigDecimal("1.2");
        BigDecimal bigDecimal1 = new BigDecimal("1.2");
        bigDecimal.equals(bigDecimal1) // true
        
        BigDecimal bigDecimal = new BigDecimal("1.20");
        BigDecimal bigDecimal1 = new BigDecimal("1.2");
        bigDecimal.equals(bigDecimal1) // false

通过查看BIgDecimal重写的equals方法,通过instanceof关键字判断当前传入对象是否为BIgDecimal的实例对象或者它的子类对象的实例,所以使用equals方法进行比较时,要注意传入的对象类型 在这里插入图片描述

2、使用compareTo()方法进行比较

使用该方法会返回三种情况(-1,0,1) a.compareTo(b) 当a<b时返回-1 当a=b时返回0 当a>b时返回1

    BigDecimal bigDecimal = new BigDecimal("1.92");
    BigDecimal bigDecimal1 = new BigDecimal("2.4");
    bigDecimal.compareTo(bigDecimal1); // -1
    bigDecimal1.compareTo(bigDecimal); // 1
    
    BigDecimal bigDecimal = new BigDecimal("1.92");
    BigDecimal bigDecimal1 = new BigDecimal("1.92");
    bigDecimal1.compareTo(bigDecimal); // 0
    
    BigDecimal bigDecimal = new BigDecimal("1.9200");
    BigDecimal bigDecimal1 = new BigDecimal("1.92");
    bigDecimal1.compareTo(bigDecimal); // 0

四、BigDecimal之间进行运算(加、减、乘、除)

1、加法运算(add)

1、BigDecimal对象名.add(BigDecimal augend) 2、BigDecimal对象名.add(BigDecimal augend, MathContext mc) augend:为要进行运算的数 mc:可以不传,调用MathContext类的指定常量值进行舍入操作:舍入方式为:RoundingMode HALF_EVEN(上面也有)

    BigDecimal a = new BigDecimal("2.34");
    BigDecimal b = new BigDecimal("5.5");
    a.add(b); // 7.84
    BigDecimal a = new BigDecimal("2.3423213123213");
    BigDecimal b = new BigDecimal("5.521321321312");
    a.add(b,MathContext.DECIMAL32); // 7.863643

2、减法运算(subtract)

1、BigDecimal对象名.subtract(BigDecimal augend) 2、BigDecimal对象名.subtract(BigDecimal augend, MathContext mc) 参数以及使用方法和加法运算差不多一直

	BigDecimal a = new BigDecimal("2.3");
	BigDecimal b = new BigDecimal("5.1");
	a.subtract(b); // -2.8

3、乘法运算(multiply)

1、BigDecimal对象名.multiply(BigDecimal augend) 2、BigDecimal对象名.multiply(BigDecimal augend, MathContext mc) 参数以及使用方法和加法运算差不多一直

    BigDecimal a = new BigDecimal("3.6");
    BigDecimal b = new BigDecimal("4.2");
    a.multiply(b); // 15.12

4、除法运算(divide)

除法有多个重载方法(此处为常用的几种) 1、BigDecimal对象名.divide(BigDecimal divisor) // 直接进行除法运算,但是如果结果是无限小数则会报错 2、BigDecimal对象名.divide(BigDecimal divisor, MathContext mc) // mc参数的用法和上述一样 3、divide(BigDecimal divisor, RoundingMode roundingMode) // 通过指定舍入方式保留一位小数 4、divide(BigDecimal divisor, int scale, int roundingMode) // 通过指定的舍入方式保留指定位数的小数(scale为保留多少位,roundingMode为四舍五入的方法)

    BigDecimal a = new BigDecimal("2.3");
    BigDecimal b = new BigDecimal("1.1");
    a.divide(b); // 由于结果是无限小数,系统抛出异常java.lang.ArithmeticException
    a.divide(b,MathContext.DECIMAL32) // 2.090909
    a.divide(b,RoundingMode.HALF_UP) // 2.1
    a.divide(b,2,RoundingMode.HALF_UP) // 2.09

五、BIgDecimal的取舍方法的使用(setScale())

setScale(int newScale, int roundingMode) newScale:保留位数 roundingMode:取舍方式(上述有介绍)BigDecimal和RoundingMode均可 推荐使用RoundingMode类型的取舍方式

BigDecimal bigDecimal = new BigDecimal("3.141592623231324")
bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP) // 3.14