0

これは私が遭遇する可能性のある問題であることは覚えていますが、その理由を忘れています。これが私のコードです。

import java.util.Scanner;

public class GroceryTab
{

    public static void main(String[] args) 
    {
         double total = 0;
         int items = 0;

        System.out.print("How many different products are you buying?");
        Scanner in = new Scanner(System.in);
        items = in.nextInt();

        for(int i=1; i<=items; i++) {
            double price;
            int numberBought;
            System.out.print("What is the price of your " + i +"th item?");
            Scanner priceIn = new Scanner(System.in);
            price = priceIn.nextDouble();

            System.out.print("How many of this item are you buying?");
            Scanner numIn = new Scanner(System.in);
            numberBought = numIn.nextInt();

            total += (price * numberBought);
        }
        System.out.print("Your list costs " + total + " dollars.");
    }
}

ここが奇妙な部分です。私はそれをテストしていました、そして私は以下を入れました:

何種類の製品を購入していますか?2

1 番目の商品の価格は?30.32

この商品をいくつ購入しますか?3

2 番目の商品の価格は?.01

この商品をいくつ購入しますか?3

そして得た

リストの費用は 90.99000000000001 ドルです。

おっと!これを獲得するために私は何をしましたか?

4

4 に答える 4

6

コメントしたいのですが、担当者がいません...

double (または一般的に浮動小数点) を使用しているためです。正確な精度が必要な場合は、BigDecimal の方が優れていますが、遅くなります。

正確な結果が得られない浮動小数点演算を参照してください。

于 2013-07-16T03:45:57.693 に答える
0

浮動小数点 (ここpricetotaldoubles です) は正確ではありません。int価格をより正確に保ちたい場合、考えられる回避策の 1 つは、価格をs (おそらくセント数)として追跡することです。

于 2013-07-16T03:44:10.993 に答える
0

BigDecimal を使用して正しく実行する:

BigDecimal total = BigDecimal.ZERO;

System.out.print("How many different products are you buying?");
Scanner in = new Scanner(System.in);
int items = in.nextInt();

for (int i=1; i<=items; i++) {
    System.out.print("What is the price of your " + i +"th item?");
    Scanner priceIn = new Scanner(System.in);
    BigDecimal price = priceIn.nextBigDecimal();

    System.out.print("How many of this item are you buying?");
    Scanner numIn = new Scanner(System.in);
    int numberBought = numIn.nextInt();

    BigDecimal lineTot = price.multiply( BigDecimal.valueOf(numberBought));
    total = total.add( lineTot);
}
System.out.print("Your list costs " + total + " dollars.");

スタイルのアドバイス: 最初にその値を割り当てるコードパスしかない場合は、値を割り当てる前に変数を宣言しないでください。

ビジネス ソフトウェア開発の面接に来て、固定小数点演算を正しく行う方法を知らなければ、採用されることはありません。

于 2013-07-16T03:56:46.640 に答える