1、BigDecimal基本介绍
当程序中涉及到金额时,必须使用 BigDecimal 而不是 double 或 float 。
1.1、浮点类型坑示例
public static void main(String[] args) { float a = 1; float b = 0.9f; System.out.println(a - b); }
2、BigDecimal 的常用方法
2.1、常用构造方法
- new BigDecimal(int val):创建一个具有参数所指定整数值的对象。
- new BigDecimal(double val):(不推荐使用,因为存在精度丢失问题)创建一个具有参数所指定双精度值的对象。
- new BigDecimal(long val):创建一个具有参数所指定长整数值的对象
- new BigDecimal(String val):(推荐使用)创建一个具有参数所指定以字符串表示的数值的对象。
public static void main(String[] args) { BigDecimal b_int = new BigDecimal(10); BigDecimal b_double = new BigDecimal(0.1); BigDecimal b_float = new BigDecimal(0.1f); BigDecimal b_string = new BigDecimal("0.1"); BigDecimal b_valueof = BigDecimal.valueOf(0.1);
System.out.println("b_int:" + b_int); System.out.println("b_double:" + b_double); System.out.println("b_float:" + b_float); System.out.println("b_string:" + b_string); System.out.println("b_valueof:" + b_valueof); }
输出如下:
使用构造函数时,推荐用 int 或 String 做参数,如果不满足,则建议使用 BigDecimal.valueOf 方法,该方法可接受 int、long、double、float 做参数,但注意不接受 String。
2.2、常用方法
注意:BigDecimal进行运算时必须要保证对象本身不能是null,否则就会抛空指针异常。
1)加减乘除
- add(BigDecimal):加,BigDecimal对象中的值相加,返回BigDecimal对象
- subtract(BigDecimal):减,BigDecimal对象中的值相减,返回BigDecimal对象
- multiply(BigDecimal):乘,BigDecimal对象中的值相乘,返回BigDecimal对象
- divide(BigDecimal):除,BigDecimal对象中的值相除,返回BigDecimal对象。该方法可能会遇到无限精度问题,会抛出异常,使用时需注意。所以我们建议在使用BigDecimal进行除运算时,一定要指定精度和舍入模式。
public static void main(String[] args) { BigDecimal a = new BigDecimal("10"); BigDecimal b = new BigDecimal("20"); BigDecimal c = new BigDecimal("30"); BigDecimal add = a.add(b); BigDecimal subtract = a.subtract(b); BigDecimal multiply = a.multiply(b); BigDecimal divide = a.divide(b); System.out.println("加结果为:" + add); System.out.println("减结果为:" + subtract); System.out.println("乘结果为:" + multiply); System.out.println("除结果为:" + divide);
// 除不尽将会抛出异常 BigDecimal divide2 = a.divide(c); }
输入结果如下:
其他常见方法:
方法 | 含义 |
abs() | 将BigDecimal对象中的值转换成绝对值 |
doubleValue() | 将BigDecimal对象中的值转换成双精度数 |
floatValue() | 将BigDecimal对象中的值转换成单精度数 |
longValue() | 将BigDecimal对象中的值转换成整数 |
compareTo(BigDecimal val) | 比较大小,返回int类型。0(相等) 1(大于) -1(小于) |
toPlainString() | 推荐使用,直接转换为字符串且不使用任何计数法 |
toString() | 转换为字符串,但在必要时使用科学计数法。 |
toEngineeringString() | 转换为字符串,但在必要时使用工程计数法。 工程记数法是一种工程计算中经常使用的记录数字的方法,与科学技术法类似,但要求10的幂必须是3的倍数 |
max(BigDecimal val) | 两值比较,返回最大值 |
negate() | 求相反数,正变负,负变正 |
pow(int n) | 求乘方,如BigDecimal.valueOf(2).pow(3)的值为8 |
3、设置精度和舍入模式
BigDecimal 并不代表无限精度,当在两个数除不尽的时候,就会报错。所以我们建议在使用BigDecimal进行除运算时,一定要指定精度和舍入模式。
public static void main(String[] args) { BigDecimal b1 = new BigDecimal("1.0"); BigDecimal b2 = new BigDecimal("3.0"); // 保留3位小数,且四舍五入 BigDecimal divide = b1.divide(b2, 3, RoundingMode.HALF_UP); System.out.println(divide);//0.33 }
3.1、BigDecimal 中的舍入模式
9、最佳实践
public static void main(String[] args) { // 使用字符串参数构造函数 BigDecimal a = new BigDecimal("10"); // 或使用BigDecimal.valueOf方法 BigDecimal b = BigDecimal.valueOf(30); BigDecimal add = a.add(b); BigDecimal subtract = a.subtract(b); BigDecimal multiply = a.multiply(b); //进行除运算时,指定精度和舍入模式,避免除不尽导致报错 BigDecimal divide = a.divide(b, 2, RoundingMode.HALF_UP); System.out.println("加结果为:" + add); System.out.println("减结果为:" + subtract); System.out.println("乘结果为:" + multiply); System.out.println("除结果为:" + divide); }
输出如下:
标签:舍入,BigDecimal,舍弃,整数,详解,println,ROUND From: https://www.cnblogs.com/wenxuehai/p/18662563