float と double の問題:
例 1:
ドル額を減算する際の計算が正しくありません:
System.out.println(1.03 - 0.42); // Resultado: 0.6100000000000001
例 2:
1 個 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 または long を使用する
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