double vs. BigDecimal

double vs. BigDecimal

這篇介紹double和BigDecimal兩者不同以及使用時機。

double 基本型別:

double型別的主要設計目標是為了科學計算和工程計算。他們執行二進位制浮點運算,這是為了在廣域數值範圍上提供較為精確的快速近似計算而精心設計的。
然而,它們沒有提供完全精確的結果,所以不應該被用於要求精確結果的場合。但是,商業計算往往要求結果精確。
Double.MAX_VALUE : 1.7976931348623157E308

BigDecimal 物件:

1.比較大小用compareTo()
public static int compareTo(double v1, double v2) {
return BigDecimalUtils.compareTo(getInstance(v1), new BigDecimal(Double.toString(v2)));
}
2.BigDecial是immutable的,就像String一樣,它的所有操作都會生成一個新的物件
3.不要用equals方法來比較BigDecimal物件,因為它的equals方法會比較scale,如果scale不一樣,它會返回false

兩者比較:

double是基本型別使用記憶體較少,BigDecimal是物件使用記憶體較多

使用時機:

1.在接收參數時數值若小於Double.MAX_VALUE,使用double基本型別來接收參數
2.計算統一用BigDecimalUtils來做加減乘除
3.加法
1
2
3
4
5
6
7
public static BigDecimal add(double v1, double v2) {
return BigDecimalUtils.add(getInstance(v1), getInstance(v2));
}
// new BigDecimal(double val)會有問題,ex : new BigDecimal(0.01);
public static BigDecimal getInstance(double value) {
return BigDecimal.valueOf(value);
}

4.減法

1
2
3
public static BigDecimal subtract(double v1, double v2) {
return BigDecimalUtils.subtract(BigDecimal.valueOf(v1), BigDecimal.valueOf(v2));
}

5.乘法

1
2
3
public static BigDecimal multiply(double v1, double v2) {
return BigDecimalUtils.multiply(getInstance(v1), getInstance(v2));
}

6.除法

1
2
3
4
5
6
public static BigDecimal divide(double v1, double v2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
return BigDecimal.valueOf(v1).divide(BigDecimal.valueOf(v2), scale, BigDecimal.ROUND_HALF_UP);
}