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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值