关于java:我的杂货店账单程序为总数增加了一个不必要的小数字

My grocery store bill program adds an unneccessary small numberto the total

本问题已经有最佳答案,请猛点这里访问。

我记得这是我遇到的一个问题,但我忘了为什么。这是我的密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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件的价格是多少?01

你要买多少件?三

然后得到

你的单子价值90.99亿美元。

哎呀!我做了什么来赚这个?


我只想评论一下,但没有代表……

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

见浮点运算不产生精确结果


使用bigdecimal并正确执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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.");

样式建议:如果只有代码路径可以最初分配该值,则在分配值之前不要声明变量。

如果你在商务软件开发的面试中不知道如何正确地做固定点,你就不会被录用。


它必须处理双精度问题。我建议使用

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

或者类似的事情,因为你用的是美元,不会想要的。哦,1美分。不管怎样,这不是你的问题。只是双打的精准度不是最好的。


浮动点(pricetotal在这里是double的)不准确;如果你想让你的价格更精确,一个可能的解决办法是像int一样跟踪价格(可能是美分)。