2017-04-04 18 views
1

私の現在のプログラムは、ピザの注文を行い、あなたがメディアピザ、オリーブ、ハムです出力間違った総出力

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で唯一の初心者だと私は多分、効率的な方法でこのコードを書いていないと私は学ぶことを理解しようとしています。

+1

史上ので便利コメントに感謝:) –

答えて

1

を参照してください。オプションの

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

ロット:

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

あなたは常に$?。00を持つように結果を強制したい場合、これは良い解決策です。価格が$ 5.83に変更された場合、それを四捨五入すると$ 6.00になります。だから私はあなたの価格が小数点を持つように変更する場合、これはすべての時間の解決ではないと思う。 –

+1

@MichaelSeltenenope 5.83 * 100 = 583ラウンド583 = 583、次に583/100 = 5.83です。 –

+0

thats right。ちょうどそれを試みた。素敵で短いテクニック。 –

2

これは、正確な金額を表すために2進浮動小数点型を使用する際の落とし穴を示しています。

簡単な生活のために(特に初心者の方が)、インテグラルタイプ(例:long)を使用し、ペンスで作業してください。詳細については

、あなたは汚れてみたい場合はIs floating point math broken?

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! ΦXocę웃Пepeúpaツ@

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)); 
    } 
}