循環小數輸出的坑
BigDecimal做除法時如果出現除不盡(循環小數)的情況,會拋異常:
BigDecimal a = new BigDecimal("1"); System.out.println(a.divide(new BigDecimal(3)));
異常如下:
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1693)
解決辦法:使用如下兩個函數設置精度
- divide(num, scale)
- divide(num, scale, roundingMode)
System.out.println(a.divide(new BigDecimal(30), 2,BigDecimal.ROUND_HALF_UP));
構造函數的坑
先看下面這段代碼:
public static void main(String[] args) { BigDecimal value1 =new BigDecimal(1024.511); System.out.println("value1: " + value1); BigDecimal value2 = new BigDecimal("1024.511"); System.out.println("value2: " + value2); }
按照我們的預想,value1輸出的應該是10.511,可是實際的值卻不是這樣,如下:
value1: 10.510999999999999232613845379091799259185791015625
value2: 10.511
當我們用double類型的數據作為參數時,構造出的 BigDecimal 對象 value1 並不能保證數據的准確性。
而用 String 作為參數構造對象時,數據絲毫不差。