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,正数向0进1,负数向0进1(与第一条相反)
例:
值: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 // 银行家舍入法 “四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4时舍去,"六"是指≥6时进上。"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:5前为奇数,舍5入1;5前为偶数,舍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方法底层代码
参数为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