一、基础概念
BigDecimal是Java中用于表示任意精度的十进制数的类,它允许我们精确地进行任何需要货币、财务、科学精度的计算。它提供了各种精确的算术、舍入和格式化操作,比如说我们可以设置小数精度、舍入方式,以及输出格式。
使用BigDecimal时需要注意以下几点:
1、BigDecimal值可以通过BigDecimal(String val)进行初始化,也可以通过BigDecimal(double val)进行初始化,但是推荐使用String进行初始化,防止丢失精度。
2、比较BigDecimal值是否相等需要使用compareTo()方法进行比较,因为使用等号进行比较可能会出现结果错误的情况。
3、如果要进行加减乘除等运算需要使用BigDecimal的相应方法进行处理,因为这些运算不能像普通数值类型那样直接运算。
二、格式化操作
BigDecimal类提供了format方法,可以将BigDecimal对象格式化为字符串,方便数据的输出和展示。format方法中,我们可以设置输出字符串的格式,包括小数位数、小数位舍入方式、组分隔符等。
1、设置小数位数
在BigDecimal对象上使用setScale方法可以设置小数位数。setScale方法有两个参数,第一个是保留的小数位数,第二个是保留方式,可以选择舍入方式,如ROUND_HALF_UP表示四舍五入。
BigDecimal value = new BigDecimal("12.3456789"); BigDecimal result = value.setScale(2, RoundingMode.HALF_UP); System.out.println(result); // 12.35
2、使用组分隔符
在format方法中使用NumberFormat类,可以方便地实现千分位分隔符的效果。使用NumberFormat.setGroupingUsed方法可以启用或禁用分组,使用NumberFormat.setGroupingSize方法可以设置每个分组的位数。
BigDecimal value = new BigDecimal("1234567890.12345"); NumberFormat numberFormat = NumberFormat.getNumberInstance(); numberFormat.setGroupingUsed(true); numberFormat.setGroupingSize(3); String result = numberFormat.format(value); System.out.println(result); // 1,234,567,890.12345
3、格式化为货币数值
使用NumberFormat.getCurrencyInstance方法可以方便地将BigDecimal对象格式化为货币数值。
BigDecimal value = new BigDecimal("1234567.89"); NumberFormat numberFormat = NumberFormat.getCurrencyInstance(Locale.US); String result = numberFormat.format(value); System.out.println(result); // $1,234,567.89
三、舍入操作
在进行数值计算时,精度控制十分重要。BigDecimal提供了多种舍入方式,可以根据不同需求选择不同的舍入方式。
1、ROUND_CEILING
向正无穷方向舍入,即如果BigDecimal是正数,则舍入结果则大于输入值;如果是负数,则舍入结果小于输入值。例如1.234使用ROUND_CEILING舍入精度为1,则结果为1.3。
BigDecimal value = new BigDecimal("1.234"); BigDecimal result = value.setScale(1, RoundingMode.CEILING); System.out.println(result); // 1.3
2、ROUND_DOWN
向零方向舍入,即舍去多余的小数。例如1.234使用ROUND_DOWN舍入精度为1,则结果为1.2。
BigDecimal value = new BigDecimal("1.234"); BigDecimal result = value.setScale(1, RoundingMode.DOWN); System.out.println(result); // 1.2
3、ROUND_FLOOR
向负无穷方向舍入,即如果BigDecimal是正数,则舍入结果则小于输入值;如果是负数,则舍入结果大于输入值。例如-1.234使用ROUND_FLOOR舍入精度为1,则结果为-1.3。
BigDecimal value = new BigDecimal("-1.234"); BigDecimal result = value.setScale(1, RoundingMode.FLOOR); System.out.println(result); // -1.3
4、ROUND_HALF_DOWN
向最接近的数字舍入,如果两个相邻的数字对于舍入精度的高低一半,则舍入到最邻近的数字,如果相等,则舍入到相邻的偶数。例如2.125使用ROUND_HALF_DOWN舍入精度为2,则结果为2.12。
BigDecimal value = new BigDecimal("2.125"); BigDecimal result = value.setScale(2, RoundingMode.HALF_DOWN); System.out.println(result); // 2.12
5、ROUND_HALF_EVEN
向最接近的数字舍入,如果两个相邻的数字对于舍入精度的高低一半,则舍入到最邻近的数字,如果相等,则舍入到偶数。例如2.125使用ROUND_HALF_EVEN舍入精度为2,则结果为2.12。
BigDecimal value = new BigDecimal("2.125"); BigDecimal result = value.setScale(2, RoundingMode.HALF_EVEN); System.out.println(result); // 2.12
6、ROUND_HALF_UP
向最接近的数字舍入,如果两个相邻的数字对于舍入精度的高低一半,则舍入到最邻近的数字,如果相等,则舍入到最近的数字,比ROUND_HALF_DOWN多舍入了一个5.例如2.125使用ROUND_HALF_UP舍入精度为2,则结果为2.13。
BigDecimal value = new BigDecimal("2.125"); BigDecimal result = value.setScale(2, RoundingMode.HALF_UP); System.out.println(result); // 2.13
7、ROUND_UNNECESSARY
不进行舍入,如果舍入结果存在非零小数,则抛出ArithmeticException异常。例如1.23使用ROUND_UNNECESSARY舍入精度为1,则抛出异常。
BigDecimal value = new BigDecimal("1.23"); try { BigDecimal result = value.setScale(1, RoundingMode.UNNECESSARY); System.out.println(result); } catch (ArithmeticException e) { System.out.println("精度不合法,无法舍入"); }
四、其他常用操作
1、比较大小
使用compareTo方法进行大小比较,如果相等返回0,小于返回-1,大于返回1。
BigDecimal value1 = new BigDecimal("1.23"); BigDecimal value2 = new BigDecimal("1.24"); int result = value1.compareTo(value2); System.out.println(result); // -1
2、最大最小值
使用max和min方法可以返回两个BigDecimal对象中较大或较小的那个对象。
BigDecimal value1 = new BigDecimal("1.23"); BigDecimal value2 = new BigDecimal("1.24"); BigDecimal max = value1.max(value2); BigDecimal min = value1.min(value2); System.out.println(max); // 1.24 System.out.println(min); // 1.23
3、取反数
使用negate方法可以返回BigDecimal对象的相反数。
BigDecimal value = new BigDecimal("1.23"); BigDecimal result = value.negate(); System.out.println(result); // -1.23
4、幂运算
使用pow方法可以返回BigDecimal对象的幂运算结果。
BigDecimal value = new BigDecimal("2"); BigDecimal result = value.pow(3); System.out.println(result); // 8
5、加减乘除运算
使用add、subtract、multiply、divide方法可以进行BigDecimal对象的加减乘除运算。
BigDecimal value1 = new BigDecimal("2"); BigDecimal value2 = new BigDecimal("3"); BigDecimal result1 = value1.add(value2); BigDecimal result2 = value1.subtract(value2); BigDecimal result3 = value1.multiply(value2); BigDecimal result4 = value1.divide(value2, 2, RoundingMode.HALF_UP); System.out.println(result1); // 5 System.out.println(result2); // -1 System.out.println(result3); // 6 System.out.println(result4); // 0.67
总结
BigDecimal类是Java中用于表示任意精度的十进制数的类,它可以让我们精确地进行任何需要货币、财务、科学精度的计算。在开发过程中,我们需要注意BigDecimal的初始化方式、比较方法、运算方式以及格式化方式等,以便使用BigDecimal进行更加精准和安全的数值计算。