Bigdecimal 操作注意事项

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

猜你喜欢

转载自blog.csdn.net/weixin_40577289/article/details/88060286