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

我只想评论,但没有代表...

这是因为您使用的是双精度(或一般的浮点)。如果您需要精确的精度 BigDecimal 更好,但速度较慢。

请参阅浮点运算不产生精确结果

于 2013-07-16T03:45:57.693 回答
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 回答
0

浮点数(price这里totaldoubles )不准确;如果您想保持价格更精确,一种可能的解决方法是将价格跟踪为ints(可能是 # 美分)。

于 2013-07-16T03:44:10.993 回答
0

它必须处理双精度。我只是建议使用

DecimalFormat df = new DecimalFormat("#.00"); 
System.out.print("Your list costs " + df.format(total) + " dollars.");

或类似的东西,因为您使用的是美元并且不想要.ooooo1 美分。无论如何,这不是你的问题。它只是双精度不是最好的。

于 2013-07-16T03:48:54.927 回答