#Java裡你還在用double作為價格的欄位型別?你犯了大錯了!
在商業計算中,比如尤其是電商這塊,你要算兩個商品的價格,可能是優惠前和優惠後的差價。
很多程式設計師,尤其是沒怎麼接觸過需要商業價格運算的行業的程式設計師都會使用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呀,這還用問麼?"。
然而真實執行出來的結果卻是:
為什麼是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,常年有大神活躍。
相關文章
- 保留兩位小數:資料庫欄位型別NUMBER,Java欄位型別Double型別資料庫型別Java
- 作為IT,你的價值在哪裡?
- 還在用 Zookeeper 作為註冊中心?小心坑死你!
- 五年了,你還在用Junit4嗎?
- HTTP/3 都來了,你卻還在用 HTTP/1.1?HTTP
- 還在用Excel維護客戶資訊?你OUT了Excel
- JavaScript中常見的錯誤,你犯了幾個?JavaScript
- 9102年了,你還在用for迴圈操作集合?
- java double、float型別的比較Java型別
- oracle的欄位型別Oracle型別
- 你還在用Adapter和ViewHolder寫RecyclerView嗎?Out了!APTView
- 修改表的欄位型別型別
- Double型別精度問題引起的錯誤型別
- 明明花了大價錢,為什麼你的CMDB還是用不起來?
- 混亂C原始碼的幾個錯誤,你犯了嗎?原始碼
- [BUG反饋]模型中的欄位型別為日期是隻儲存了年份模型型別
- SAP WM中階儲存型別裡的Full stk rmvl 欄位和Return Storage type欄位型別
- SqlSugar code first 欄位為列舉型別,預設生成資料庫欄位為bigint如何設定為int型別SqlSugar型別資料庫
- 想問下,onethink建立模型的時候建立價格欄位需要2位小數用什麼型別模型型別
- MongoDB更改欄位型別MongoDB型別
- 你還在用var定義變數嗎?變數
- 還在用Synchronized?Atomic你瞭解不?synchronized
- 欄位管理,為什麼只有新增的時候才自動匹配欄位型別型別
- 你還在用分頁?試試 MyBatis 流式查詢,真心強大!MyBatis
- MongoDB中的欄位型別IdMongoDB型別
- oracle 修改欄位型別的方法Oracle型別
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- 你用的32位還是64位?有什麼區別呢?
- 你還在手寫TS型別程式碼嗎型別
- sql語句修改欄位型別和增加欄位SQL型別
- iOS-HealthKit裡你未了解的資料型別iOS資料型別
- Java 泛型,你瞭解型別擦除嗎?Java泛型型別
- WHRER條件裡的資料型別必須和欄位資料型別一致資料型別
- MySQL欄位型別最全解析MySql型別
- date、timestamp欄位型別型別
- MySQL欄位型別小記MySql型別
- 資料欄位型別匹配型別
- sqlite sql 修改欄位型別SQLite型別