#Java裡你還在用double作為價格的欄位型別?你犯了大錯了!

Java小蕭發表於2018-12-14

在商業計算中,比如尤其是電商這塊,你要算兩個商品的價格,可能是優惠前和優惠後的差價。

很多程式設計師,尤其是沒怎麼接觸過需要商業價格運算的行業的程式設計師都會使用double來描述一個金額。

於是便出現了下面這個計算

如果有想學習java的程式設計師,可來我們的java學習扣qun:94311,1692免費送java的視訊教程噢!我整理了一份適合18年學習的java乾貨,送給每一位想學的小夥伴,並且每天晚上8點還會在群內直播講解Java知識,歡迎大家前來學習哦。

public static void main(String[] args) {
 double priceA = 0.03;double priceB = 0.02;
System.out.println(priceA - priceB);
}

這個算出來是多少。

我保證肯定有很多人會說:"0.01呀,這還用問麼?"。

然而真實執行出來的結果卻是:

Java裡你還在用double作為價格的欄位型別?你犯了大錯了!

為什麼是0.009999999999999998 而不是0.01

因為float和double都是浮點數, 都有取值範圍, 都有精度範圍. 浮點數與通常使用的小數不同, 使用中, 往往難以確定。

常見的問題是定義了一個浮點數, 經過一系列的計算, 它本來應該等於某個確定值, 但實際上並不是!

金額必須是完全精確的計算, 故不能使用double或者float, 而應該採用java.math.BigDecimal。

在《Effective Java》這本書中也提到這個原則,float和double只能用來做科學計算或者是工程計算,在商業計算中我們要用 java.math.BigDecimal。而且使用BigDecimal類也可以進行大數的操作。

BigDecimal具體的操作參見:https://www.hellojava.com/article/128

所以改成如下程式碼:

public static void main(String[] args) {
 BigDecimal priceA = BigDecimal.valueOf(0.03);
 BigDecimal priceB = BigDecimal.valueOf(0.02);
 System.out.println(priceA.subtract(priceB));
}

執行出來的結果就對了。

以上程式碼執行出來的結果就是:

0.01

更多技術討論,歡迎加入我們的Java新手群:294557894,常年有大神活躍。

相關文章