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美分。不管怎样,这不是你的问题。只是双打的精准度不是最好的。
浮动点(