在Java中,float和double都表示浮點型數,所表示的浮點數是近似值,而不是精確的值,所以,這兩種數據類型不適合作為價格的數據類型。Java語言提供另外一種數據類型BigDecimal,可以用來表示精確的浮點數。
package com.zhhvip; import java.math.BigDecimal; public class Test { public static void main(String[] args) { double d1 = 20.15; double d2 = 10.10; System.out.println("double類型的運行結果:"+(d1-d2)); BigDecimal bigDecimal1 = BigDecimal.valueOf(d1); BigDecimal bigDecimal2 = BigDecimal.valueOf(d2); System.out.println("BigDecimal類型的運行結果:"+(bigDecimal1.subtract(bigDecimal2))); // 錯誤的使用方式 BigDecimal bigDecimal3 = new BigDecimal(d1); BigDecimal bigDecimal4 = new BigDecimal(d2); System.out.println("BigDecimal類型錯誤使用方式的運行結果:"+(bigDecimal3.subtract(bigDecimal4))); // 正確的使用方式 BigDecimal bigDecimal5 = new BigDecimal("20.15"); BigDecimal bigDecimal6 = new BigDecimal("10.10"); System.out.println("BigDecimal類型正確使用方式的運行結果:"+(bigDecimal5.subtract(bigDecimal6))); } }
運行結果:
注意,new 一個BigDecimal時候,只有參數為String類型時候才能夠正確表示,為什么BigDecimal.valueOf()又可以呢?因為BigDecimal.valueOf()本質上也是調用了參數類型為String的構造方法。
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)); }