float和double類型主要是爲了科學計算和工程計算而設計的。它們執行二進制浮點運算,這是爲了在普遍的數值範圍上提供較爲精確的快速近似計算而精心設計的。它們並無提供徹底精確的結果。 java
float和double尤爲不適合用於貨幣計算,由於要讓一個float獲取double精確的表示0.1是不可能的 設計
System.out.println(1.03-0.42); //結果0.6100000000000001
double funds=1.00; int itemsBought=0; for(double price=0.1;funds>=price;price+=0.1){ funds-=price; itemsBought++; } System.out.println("itemsBought="+itemsBought+";change="+funds); //結果itemsBought=3;change=0.3999999999999999解決這個問題的辦法是使用BigDecimal、int或者long進行貨幣計算
final BigDecimal TEN_CENTS=new BigDecimal("0.1"); int itemsBought=0; BigDecimal funds=new BigDecimal("1.0"); for(BigDecimal price=TEN_CENTS;funds.compareTo(price)>=0;price=price.add(TEN_CENTS)){ itemsBought++; funds=funds.subtract(price); } System.out.println("itemsBought="+itemsBought+";change="+funds); //結果itemsBought=4;change=0.0可是使用BigDecimal有兩個缺點:很不方便並且速度慢
固然也能夠使用int或long,最明顯的作法就是以分爲單位進行計算而不是元 code
//effective java總結 ci