float 和 double 問題:
範例1:
減去美元金額時計算錯誤:
System.out.println(1.03 - 0.42); // Resultado: 0.6100000000000001
範例2:
以每件 10 美分的價格購買 9 件商品時出錯:
System.out.println(1.00 - 9 * 0.10); // Resultado: 0.09999999999999998
即使四捨五入,錯誤仍然存在。
累進計算存在問題,例如以 0.10 到 1.00 的增量價格購買糖果時。
範例3:
買糖果時出錯,直到你沒錢了:
double funds = 1.00; for (double price = 0.10; funds >= price; price = 0.10) { funds -= price; } System.out.println(funds); // Resultado: 0.3999999999999999
解決方案1:使用BigDecimal
BigDecimal 範例:
BigDecimal funds = new BigDecimal("1.00"); BigDecimal price = new BigDecimal("0.10"); int itemsBought = 0; while (funds.compareTo(price) >= 0) { funds = funds.subtract(price); price = price.add(new BigDecimal("0.10")); itemsBought ; } System.out.println(itemsBought " items bought. Money left: " funds); // Resultado: 4 items bought. Money left: 0.00
計算現在很精確。
BigDecimal的缺點:
解決方案2:使用int或長
int 範例(以分為單位):
int funds = 100; // 1.00 dólar = 100 centavos int price = 10; // 0.10 dólar = 10 centavos int itemsBought = 0; while (funds >= price) { funds -= price; price = 10; itemsBought ; } System.out.println(itemsBought " items bought. Money left: " funds); // Resultado: 4 items bought. Money left: 0
計算又快又準。
結論:
選擇:
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3