输出错误的总输出

时间:2017-04-04 13:21:28

标签: java

如果您输入

,我当前的程序会制作披萨订单
moho

这是中等披萨,橄榄,火腿,橄榄的价格输出应该是:

Medium pizza with,olives,ham,olives,£7.00

但是,我得到了:

Your order is: Medium pizza with,olives,ham,olives,£6.999999999999999

如何制作它以便输出正确的输出?我已经完成了代码,但似乎无法找出原因。

    public class pizza {
    public static void main(String[] args){
        pizzaServiceA();
    }
    public static void pizzaServiceA(){
        Scanner input = new Scanner(System.in);
        double total = 0;
        System.out.println("Enter order:");
        String order = input.next();
        String pizza = "Your order is: ";

        if (order.equals("quit")){
            System.out.println("Program exiting.");
            System.exit(0);
        }

        boolean size = false;
        for (int x = 0; x < order.length(); x++){
        if (order.charAt(0) == 'm' || order.charAt(0) == 'l'){
            if (order.charAt(x) == 'm'){
                total +=4.00;
                pizza += "Medium pizza with,";
                size = true;
            }
            else if (order.charAt(x) == 'l'){
                total +=5.00;
                pizza +="Large pizza with,";
            }
            else if (order.charAt(x) == 'h'){
                pizza +="ham,";
                if (size) total += 1.40; 
                else total +=2.10;
            }
            else if (order.charAt(x)== 'o'){
                pizza +="olives,";
                if(size) total +=0.80;
                else total +=1.20;
            }
            else if (order.charAt(x)=='p'){
                pizza+="pineapple,";
                if(size) total +=1;
                else total+=1.50;
            }
            else if (order.charAt(x)=='s'){
                pizza+="spinach,";
                if(size) total +=0.80;
                else total+=1.20;
            }
            else if (order.charAt(x)=='m'){
                pizza +="mozarella,";
                if(size) total =+ 1;
                else total+=1.50;
            }
        }
        else {
            System.out.println("Your first character must be m(medium) or l(large)");
        }
      }
        System.out.println(pizza +"£" + total + "0");
    }
}

注意:我理解我可能不会以有效的方式编写此代码,因为我只是Java的初学者而且我正在努力学习。

4 个答案:

答案 0 :(得分:2)

这体现了使用二进制浮点类型来表示确切货币价值的陷阱。

为了轻松生活(特别是考虑到你是初学者),请使用整数类型(例如long)并以便士为中心。

有关详细信息,请参阅Is floating point math broken?

答案 1 :(得分:1)

如果你想尝试脏话:

double total = 651.5176515121351;    
total = Math.round(total * 100);
total = total /100;

很多选择:

String result = String.format("%.2f", total );

答案 2 :(得分:0)

有很多方法可以进行舍入等。但是,请查看使用数学库中的BigDecimal的http://www.javaranch.com/journal/2003/07/MoneyInJava.html。希望这会有所帮助。

例如.. src:http://www.javaranch.com/journal/2003/07/MoneyInJava.html - BigDecimal to the Rescue!

import java.text.*;
import java.math.*;

public class addCurrency{
   public static void main(String[] args) {
      BigDecimal val1 = new BigDecimal("12.52");
      BigDecimal val2 = new BigDecimal("17.21");
      BigDecimal tot = val1.add(val2);
      System.out.println(NumberFormat.getCurrencyInstance().format(tot));
   }
}

答案 3 :(得分:0)

public class fungsi_umur {

    public static void umur(int tahunlahir, int tahunsekarang) {

        int umur = tahunsekarang - tahunlahir;
        System.out.print("Masukan umur :");
        System.out.print("Masukan nama :");

        if (umur <= 12){
            System.out.print("Umur Saya = "+umur);
            System.out.print("Saya Adalah Anak Anak");
            System.out.print("umur<= 12 ");umur(tahunlahir,tahunsekarang);


        }else if (umur > 12 && umur <= 18){
            System.out.println("Umur Saya = "+umur);
            System.out.println("Saya Adalah Remaja");umur(tahunlahir,tahunsekarang);
            System.out.print("umur > 12 && umur <= 18");umur(tahunlahir,tahunsekarang);

        }else if (umur > 18){
            System.out.println("Umur Saya = "+umur);
            System.out.println("Saya Adalah Dewasa");umur(tahunlahir,tahunsekarang);
            System.out.print("umur > 18");umur(tahunlahir,tahunsekarang);
        }
    }
    public static void main(String[] args) {

    }
}