#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,常年有大神活躍。
相關文章
- 作為IT,你的價值在哪裡?
- 還在用 Zookeeper 作為註冊中心?小心坑死你!
- 9102年了,你還在用for迴圈操作集合?
- 五年了,你還在用Junit4嗎?
- JavaScript中常見的錯誤,你犯了幾個?JavaScript
- HTTP/3 都來了,你卻還在用 HTTP/1.1?HTTP
- 你還在用Adapter和ViewHolder寫RecyclerView嗎?Out了!APTView
- java double、float型別的比較Java型別
- 你還在用if-else嗎?
- 還在用Excel維護客戶資訊?你OUT了Excel
- 當你寫圖片的 alt 時,你是否犯了這五個錯誤?
- SqlSugar code first 欄位為列舉型別,預設生成資料庫欄位為bigint如何設定為int型別SqlSugar型別資料庫
- 想問下,onethink建立模型的時候建立價格欄位需要2位小數用什麼型別模型型別
- 混亂C原始碼的幾個錯誤,你犯了嗎?原始碼
- MongoDB更改欄位型別MongoDB型別
- 還在用Synchronized?Atomic你瞭解不?synchronized
- [BUG反饋]模型中的欄位型別為日期是隻儲存了年份模型型別
- 欄位管理,為什麼只有新增的時候才自動匹配欄位型別型別
- SAP WM中階儲存型別裡的Full stk rmvl 欄位和Return Storage type欄位型別
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- 【MybatisPlus】資料庫的datetime型別欄位為空的時候,報錯空指標?MyBatis資料庫型別指標
- sql語句修改欄位型別和增加欄位SQL型別
- 明明花了大價錢,為什麼你的CMDB還是用不起來?
- ES Mapping ,1 欄位型別APP型別
- MySQL欄位型別最全解析MySql型別
- 你還在用var定義變數嗎?變數
- 你用的32位還是64位?有什麼區別呢?
- Java資料型別與資料庫欄位型別對應關係Java資料型別資料庫
- [提問交流]建立模型,新增屬性,欄位型別如何設定2位小數的欄位型別模型型別
- 你還在用分頁?試試 MyBatis 流式查詢,真心強大!MyBatis
- Java 泛型,你瞭解型別擦除嗎?Java泛型型別
- 你還在手寫TS型別程式碼嗎型別
- SQL中欄位比較型別不匹配錯誤:‘cannot be cast to’SQL型別AST
- 從燃盡圖看專案管理:你的專案哪裡出錯了?(燃盡圖型別全解析)專案管理型別
- iOS-HealthKit裡你未了解的資料型別iOS資料型別
- 【mongo】mongo 欄位型別互轉Go型別
- Mysql varchar型別欄位為什麼經常定義為255MySql型別
- JSON欄位型別在ORM中的使用JSON型別ORM