在項目中,通常遇到關於金錢方面的,咱們會使用BigDecimal類型存儲金額,可是一般狀況下金額都是double類型,須要轉換爲BigDecimal類型。可是使用不當,會形成金額錯誤。java
##問題重現app
public class TestBigDecimal { public static void main(String[] args) { double d = 201111.05; System.out.println(d);//201111.05 BigDecimal decimal = new BigDecimal(d); System.out.println(decimal);//201111.0499999999883584678173065185546875 System.out.println(decimal.setScale(1, RoundingMode.HALF_UP));//201111.0 } }
201111.05 201111.0499999999883584678173065185546875 201111.0
從上面代碼運行結果能夠看出,double類型的變量轉換成BigDecimal類型的時候數值發生了改變, 精度丟失了,所以不能使用此構造方法進行轉換。 ##解決方法code
import java.math.BigDecimal; public class TestBigDecimal { public static void main(String[] args) { double d = 201111.05; System.out.println(new BigDecimal(Double.toString(d)));//201111.05 System.out.println(BigDecimal.valueOf(d));//201111.05 } }
201111.05 201111.05
BigDecimal使用參數爲String類型的構造器或者使用BigDecimal.valueOf()方法替代。BigDecimal.valueOf()方法內部也是使用new BigDecimal(String value)類型構造器進行實例化。
public static BigDecimal valueOf(double val) { // Reminder: a zero double returns '0.0', so we cannot fastpath // to use the constant ZERO. This might be important enough to // justify a factory approach, a cache, or a few private // constants, later. return new BigDecimal(Double.toString(val)); }