我正在开发一个嵌套if的程序,而且我的数学是正确的,唯一的一点是正确的输出没有打印。我不知道我应该把输出行放在第一个if,嵌套if或者两行中?我正在进行测试的价值是进口香水瓶27.99。输出应该是32.19,我得到34.99。
public class SalesTax
{
public static void main(String[] args)
{
// Input items for shopping cart
HashMap<String, String> cart = new HashMap<String, String>();
HashMap<String, String> shoppingcart = new HashMap<String, String>();
// Create a Scanner
Scanner input = new Scanner(System.in);
// variables
char done;
//boolean goods;
double totalprice = 0.00;
double taxprice;
double ftax;
// Pick items for list.
do
{
System.out.print("Please enter an item.");
String item = input.nextLine();
System.out.print("Please enter the price for "+ item + ": ");
String price = input.nextLine();
double price1 = Double.parseDouble(price);
totalprice += price1;
//System.out.println(String.format("%.2f",totalprice));
String price2 = String.valueOf(price1);
cart.put(item, price2);
//determine if item will have additional tax
if (item.contains("music"))
{
price1 = Double.parseDouble(price);
taxprice = price1 * .10;
totalprice = (totalprice + taxprice);
if (item.contains("imported"))
{
price1 = Double.parseDouble(price);
ftax = price1 * .05;
totalprice = (totalprice + taxprice + ftax);
}
//System.out.println(String.format("%.2f",totalprice));
String newprice2 = String.valueOf(String.format("%.2f", totalprice));
shoppingcart.put(item,newprice2);
}
else if(item.contains("bottle"))
{
price1 = Double.parseDouble(price);
taxprice = price1 * .10;
totalprice = (price1 + taxprice);
if (item.contains("imported"))
{
price1 = Double.parseDouble(price);
ftax = price1 * .05;
totalprice = (totalprice + taxprice + ftax);
}
//System.out.println(String.format("%.2f",totalprice));
String newprice2 = String.valueOf(String.format("%.2f", totalprice));
shoppingcart.put(item,newprice2);
}
else if (item.contains("imported"))
{
price1 = Double.parseDouble(price);
taxprice = price1 * .05;
totalprice = (totalprice + taxprice);
if (item.contains("imported"))
{
price1 = Double.parseDouble(price);
ftax = price1 * .05;
totalprice = (totalprice + taxprice + ftax);
}
//System.out.println(String.format("%.2f",totalprice));
String newprice2 = String.valueOf(String.format("%.2f", totalprice));
shoppingcart.put(item,newprice2);
}
else
{
shoppingcart.put(item, price);
}
System.out.print("Would you like to continue to add items? (Type Y) for Yes and (Type N) for No.");
done = input.nextLine().charAt(0);
} while(Character.toUpperCase(done) == 'Y');
System.out.println("Your cart contains the following at items with tax" + shoppingcart); //+ String.format("%.2f", totalprice));
System.out.println(String.format("%.2f",totalprice));
}
}
答案 0 :(得分:2)
尝试使用bigDecimal而不是float或double。
事实上,如果您尝试:
double value = 10*0.09;
System.out.println(value);
你有:
0.8999999999999999
使用此方法:
BigDecimal value1 = new BigDecimal("10");
BigDecimal value2 = new BigDecimal("0.09");
BigDecimal value = value1.multiply(value2);
System.out.println(value);
答案 1 :(得分:1)
您要两次加税:
totalprice = (price1 + taxprice);
if (item.contains("imported"))
{
price1 = Double.parseDouble(price);
ftax = price1 * .05;
totalprice = (totalprice + taxprice + ftax);
}
应该是:
totalprice = (price1 + taxprice);
if (item.contains("imported"))
{
ftax = price1 * .05;
totalprice = (price1 + taxprice + ftax);
}
或者:
totalprice = (price1 + taxprice);
if (item.contains("imported"))
{
ftax = price1 * .05;
totalprice = (totalprice + ftax);
}
哦,并且不需要再次从字符串中解析price1
。它已包含正确的值。
答案 2 :(得分:0)
我想你应该更好地构建你的代码。我会添加一个名为&#39; calculateTax&#39;:
的方法...
double totalPrice = originalPrice + originalPrice * calculateTax(originalPrice, item);
String newprice = String.valueOf(String.format("%.2f", totalprice));
shoppingcart.put(item,newprice);
...
public double calculateTax(double originalPrice, String item){
double tax = 0.0;
if(item.contains("music")){
tax += originalPrice * O.1;
}
if(item.contains("bottle")){
tax += originalPrice * O.1;
}
if(item.contains("imported")){
tax += originalPrice * O.05;
}
return tax
}
答案 3 :(得分:0)
第二次添加taxprice
时可以找到您的错误。
if (item.contains("music"))
{
totalprice = (price1 + taxprice);
...
if (item.contains("imported"))
{
...
totalprice = (totalprice + taxprice + ftax); // <- You've already added the taxprice
}
...
}
所以:
totalprice = (totalprice + taxprice + ftax);
应改为
totalprice = (totalprice + ftax);
// (Or shorter)
totalprice += ftax;
另外,还有一些其他建议:
while-loop
或recursion
:使用while循环或递归与单个if,else-if,else case(或{{ 1}})。从代码中我可以看出你对编程很陌生,但是拥有重复的代码绝不是你想要的。 :)
try-catches:另外,我会在switch-case
周围使用try-catch,以防输入的内容无法解析(如某些内容)随机字母):
Double.parseDouble(...);
BigDecimals:这对我来说也是一个新手,但几个星期前我听说双打和花车在使用货币时非常糟糕。可以在here或here找到包含更多信息的相关信息。相反,请使用try{
price1 = Double.parseDouble(price);
}
catch(ParseException ex){
price1 = 0.00;
}
。
答案 4 :(得分:0)
嘿嗨,你的输入是:
imported bottle of perfumes & Price is 27.99
它进入第二个if if条件,即(否则if(item.contains(“bottle”)))
如果你的计算基于ans只会是34.99。
我认为你的计算基于第3个if else。
例如:
Please enter an item: imported bottle of perfumes
Enter the price for imported bottle of perfumes: 27.99
然后
taxprice:2.799
totalprice:30.788999999999998
ftax:1.3995
totalprice = (totalprice + taxprice + ftax);
i.e totalprice: 34.99 only and its correct.
但如果您的输入是这样的:
Please enter an item: imported perfumes
Enter the price for imported bottle of perfumes: 27.99
然后
taxprice:1.399
totalprice:29.389499999999998
ftax:1.3995
totalprice = (totalprice + taxprice + ftax)
i.e totalprice: = 32.19
希望你弄错了,用输入值进行交叉检查。