「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 項目 正確な答えが必要な場合は、float と double を避ける

項目 正確な答えが必要な場合は、float と double を避ける

2024 年 11 月 6 日に公開
ブラウズ:295

Item  Evite o float e o double caso sejam necessárias respostas exatas

float と double の問題:

  • 科学的および数学的計算用に設計されており、2 進浮動小数点演算を実行します。
  • 金銭の計算や正確な答えが必要な状況には適していません。
  • 0.1 などの 10 の負の累乗を正確に表すことができないため、エラーが発生します。

例 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 の double コンストラクターの使用を避け、String コンストラクターを優先します。

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 を使用する

  • 精度の問題を避けるため、double を使用したドルの代わりに 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

計算は高速かつ正確です。

結論:

  • 正確な精度が必要な計算には float または double を使用しないでください。
  • 通貨計算や小数精度が必要な状況には BigDecimal を使用します。
  • 大きな数値を含まない財務計算には int または long を使用し、計算をセント単位で行います。

選択肢:

  • 最大 9 桁の場合は、int を使用します。
  • 最大 18 桁の場合は、long を使用します。
  • それより大きい数量の場合は、BigDecimal を使用します。
  • この要約は、コンテキストに応じて、BigDecimal、int、long のいずれかを選択することで、精度とパフォーマンスの両方を最適化できることを示しています。
リリースステートメント この記事は次の場所に転載されています: https://dev.to/giselecoder/item-60-evite-o-float-e-o-double-caso-sejam-necessarias-respostas-exatas-3mep?1 侵害がある場合は、 Study_golang@163 .comdelete に連絡してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3