Bigdecimal 平时用的很多,这里记一下平时用的多的几个方法和问题:
构造一个Bigdecimal 对象时常使用的方法:
public static void main(String[] args) {
System.out.println(new BigDecimal("10"));
System.out.println(new BigDecimal(10));
System.out.println(new BigDecimal(10L));
System.out.println(new BigDecimal(10.2));
}
如果传入的参数不能转换,那么会出现java.lang.NumberFormatException:
public static void main(String[] args) {
System.out.println(new BigDecimal("10a"));
}
生成完了以后就可以进行操作了,首先可以为其设置精度:
public static void main(String[] args) {
System.out.println(new BigDecimal("1234.12").setScale(2));
System.out.println(new BigDecimal("1234.1").setScale(2));
System.out.println(new BigDecimal("1234.0").setScale(2));
}
控制台输出为:
1234.12
1234.10
1234.00
如果传入的数精度大于指定的精度,那么会出现精度丢失的问题,如下:
public static void main(String[] args) {
System.out.println(new BigDecimal("1234.123").setScale(2));
}
此时会报出错误:
Exception in thread "main" java.lang.ArithmeticException: Rounding necessary
at java.math.BigDecimal.divideAndRound(BigDecimal.java:1452)
at java.math.BigDecimal.setScale(BigDecimal.java:2402)
at java.math.BigDecimal.setScale(BigDecimal.java:2449)
此时需要设置舍入模式:
public static void main(String[] args) {
System.out.println(new BigDecimal("1234.123").setScale(2,BigDecimal.ROUND_DOWN));
}
控制台输出:
1234.12
同时也能进行多余的精度去除,比如可以去除多余的0:
public static void main(String[] args) {
System.out.println(new BigDecimal("1234.123000"));
System.out.println(new BigDecimal("1234.123000").stripTrailingZeros().toPlainString());
}
此时控制台输出:
1234.123000
1234.123
然后就是正常的加减乘除的方法:
public static void main(String[] args) {
//加
System.out.println(new BigDecimal("1234.123").add(new BigDecimal("1.33")));
//减
System.out.println(new BigDecimal("1234.123").subtract(new BigDecimal("1.33")));
//乘
System.out.println(new BigDecimal("1234.123").multiply(new BigDecimal("1.33")));
//除
System.out.println(new BigDecimal("1234.123").divide(new BigDecimal("1.33")));
}
此时控制台输出:
1235.453
1232.793
1641.38359
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1616)
这里同样也是出现了精度丢失的问题,同样设置好舍入模式后:
public static void main(String[] args) {
System.out.println(new BigDecimal("1234.123").divide(new BigDecimal("1.33"),BigDecimal.ROUND_DOWN));
}
控制台输出:
927.912