2012-09-10 27 views
0

我寫代碼來測試方法,顯示食品及價格:的Java模怪異

import java.util.Scanner; 
public class JavaTutorial5Class { 

     public static void main(String[] args) 
     { 
      greeting("Thunderdome"); 
      prices("Fatburger", 7.50); 
     } 
     static void greeting(String restaurant) 
     { 
      System.out.println("Welcome to " + restaurant); 
     } 

     static void prices(String burger, double price){ 
      System.out.print(burger + " is " + "$" + price); 
      //System.out.println(Math.ceil(price % 10)); 
      if (Math.ceil(price % 10) == 8.0){ 
       System.out.print("0"); 
      } 
     } 
    } 

爲什麼price % 10 == 8.0?這真的是你必須做的,以獲得在那裏拖尾0?

編輯:所有這些代碼是應該做的是打印「Fatburger公司爲$ 7.50」的問題是,只是給它的論據7.50將其轉換爲7.5。

+1

代碼應該做什麼?它沒有多大意義。 – SJuan76

+2

這是*餘數*運算符如何工作的注意事項(注意它不是*模數*運算符)。 – oldrinb

+0

解決了它應該做的事......我認爲這是模數運算符...有什麼區別? – user1159454

回答

4

在這段代碼中,你得到8.0原因是由於您使用Math.ceil來。

7.5 % 107.5,並Math.ceil(7.5)8.0

然而,這是一件非常經常出現,是對初學者來說非常常見的錯誤......價格應該幾乎從來沒有被存儲爲雙打。雙算術並不總是如你所期望的那樣精確,主要是因爲實際存儲雙倍的數量。例如,考慮一下:

double sum = 0.0; 
int n = 6; 
for (int i = 0; i < n; i++) { 
    sum += 1.0/n; 
} 
System.out.println(sum); 

你會期待它輸出1.0,但它實際上輸出0.9999999999999999

正確的方式來處理的價格是有兩個int S:一個是美元,一個用於美分。

+0

謝謝,我真的不知道我在做什麼雙打,我只是跟隨這傢伙類型。我以前沒有想過分割美元和美分,好主意 – user1159454

+1

甚至更​​簡單:使用bigdecimal。 – assylias

2

試試這個:

static void prices(String burger, double price){ 
    System.out.print(burger + " is $" + price); 
    if ((int)(price * 10) == price * 10) 
     System.out.print(0); 
} 

當你擁有了它,現在,7.5 % 10只是返回7.5Math.ceil輪這份長達8.0

2

價格%10實際上是7.5。 Modulu是除法的其餘部分(或一個數字可以裝入另一個的次數)。例如,22%10是2,因爲10可以在不超過22次的情況下適應22次。以最高限度將其提高到最接近的整數,將其提高到7.5。因此if語句的結果是正確的。

2

我認爲他最終希望解決方案(以打印貨幣形式的雙)可以解決爲使...

添加進口

import java.text.NumberFormat; 

,並使用此代碼

NumberFormat nf = NumberFormat.getCurrencyInstance(); 
System.out.print(burger + " is " + "$" + nf.format(price)); 

忘記所有的東西取模(它是在複雜化和不正確的方法來達到你所要求的)。

也有輕微的四捨五入問題與雙打,如果你需要完美的精度(懷疑給你的代碼的其餘部分),但通常的標準是使用2個整型來存儲貨幣)。