double類型轉BigDecimal類型精度丟失

在項目中,通常遇到關於金錢方面的,咱們會使用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));
    }
相關文章
相關標籤/搜索