-3

私の出力の問題がどこにあるのか、誰にも分かりますか?

Java プログラムを作成し、Eclipse を使用して Mac ライオンの VM で実行しました。1.41を取得する代わりに1.4100000000000001、マシンに乗りました。

Example:
Enter the number of quarter: 4
Enter the number of dimes: 3
Enter the number of nickels: 2
Enter the number of pennies: 1

Total $1.4100000000000001

Example: 
Enter the number of quarter: 3
Enter the number of dimes: 2
Enter the number of nickels: 1
Enter the number of pennies: 6

Total $1.06

Example:
Enter the number of quarter: 5
Enter the number of dimes: 7
Enter the number of nickels: 4
Enter the number of pennies: 4

Total $2.1900000000000004

出力が正しい場合もあれば、問題がある場合もあります。

コード:

import java.util.*;

public class CountChange
{
    public static void main(String[]args)
    {   
        Scanner inputScanner = new Scanner(System.in);
        System.out.print("Enter the number of quarters: ");
        int quarters = inputScanner.nextInt();
        System.out.print("Enter the number of dimes: ");
        int dimes = inputScanner.nextInt();
        System.out.print("Enter the number of nickles: ");
        int nickles = inputScanner.nextInt();
        System.out.print("Enter the number of pennies: ");
        int pennies = inputScanner.nextInt();
        inputScanner.close();

        double total =0.00;
        total = quarters * 0.25 + dimes * 0.1 + nickles * 0.05 + pennies * 0.01;

        System.out.println("Total $" + total);
        System.out.print("Thank you");
    }
}
4

3 に答える 3

2

あなたの問題は、浮動小数点(簡単に言えば、float/double関連する計算)がどのように行われるかに関連しています。浮動小数点数はおおよその表現です (背後にある理論に興味がある場合、標準はIEEE754です)。ここでは、おおよその表現を正確に取得しています。

intあなたはお金を扱っているので、通貨はセントしかありません(通貨で 0.0001$ を持つことはできませんlong)。次に、結果を表示するときに 100 で割ります。

于 2013-10-03T20:31:00.890 に答える
1

浮動小数点数を s として表現することの不正確さを経験しましたdouble。数値 0.1 は 2 進数で正確に表すことができないため0.1、Java で言うと、可能な限り最も近い近似値が得られ0.1ます。同じことが と にも当てはまり0.05ます0.01

あなたができることがいくつかあります:

  • 浮動小数点演算を可能な限り延期します。

例:

total = quarters * 25 + dimes * 10 + nickles * 5 + pennies;
total /= 100.0;
  • a を使用して、DecimalFormat小数点以下 2 桁の表示を切り捨てます。

例:

DecimalFormat df = new DecimalFormat("0.00");
System.out.println("Total $" + df.format(total));

これらの回避策はいずれも、基本的な問題 (a による数値の不正確な表現) を回避するものではありませんdouble。特に金額の場合は使用しないでくださいdoubleBigDecimal代わりに、精度が任意の a を使用することもできます。

于 2013-10-03T20:31:24.983 に答える