2016-11-13 40 views
1

碼1 2個類似的計劃不同的價值: 1級爲什麼我得到下面,即使我只改變類型的方法的價值

import java.text.NumberFormat; 

public class testing2 { 
int balance; 

void addInterest(int rate) { 
    balance += balance*(rate/100); 

} 

void display() { 
    NumberFormat currency = NumberFormat.getCurrencyInstance(); 

    System.out.print ("The balance is "); 
    System.out.print(currency.format(balance)); 

    } 
} 

2級

import java.util.Random; 

public class testing { 

public static void main (String args[]) { 

    testing2 aTesting = new testing2(); 
    Random Myrandom = new Random(); 

    aTesting.balance = Myrandom.nextInt(501); 
    int rate2 = 5; 

    System.out.println("Current balance: " + aTesting.balance); 
    System.out.println("Current rate: " + rate2); 

    aTesting.addInterest(rate2); 

    aTesting.display(); 

    System.out.println(); 
    } 
} 

OUTPUT:

當前餘額:327 當前速度:5 的平衡是MYR327.00

代碼2: 1類

import java.text.NumberFormat; 

public class testing2 { 
double balance; 

void addInterest(double rate) { 
    balance += balance*(rate/100); 

} 

void display() { 
    NumberFormat currency = NumberFormat.getCurrencyInstance(); 

    System.out.print ("The balance is "); 
    System.out.print(currency.format(balance)); 

    } 
} 

2類

import java.util.Random; 

public class testing { 

public static void main (String args[]) { 

    testing2 aTesting = new testing2(); 
    Random Myrandom = new Random(); 

    aTesting.balance = Myrandom.nextInt(501); 
    double rate2 = 5; 

    System.out.println("Current balance: " + aTesting.balance); 
    System.out.println("Current rate: " + rate2); 

    aTesting.addInterest(rate2); 

    aTesting.display(); 

    System.out.println(); 
    } 
} 

OUTPUT:

當前餘額:170.0 當前速度: 5.0 餘額爲MYR178.50

結論:第一個程序在第二個程序沒有改變餘額的最終值時。這是什麼原因?我只是將變量的類型從int更改爲double而沒有更多。

+0

爲什麼你不製作標題,然後把問題放在身體裏? –

+1

我真的不明白你爲什麼要粘貼兩次相同的類。你可以寫出你改變的那一行。 – janos

+0

問題完全出現在「rate/100」表達式中。當'rate'是值爲5的'int'時,該表達式的值爲0,因爲除法是在整數運算中執行的。 –

回答

0

這是因爲在你首先必須:

INT率2 = 5;

和你的第二個你必須:

雙率2 = 5;

您應該在處理貨幣類型值時使用double。

+0

這就是問題中提到的改變。沒有任何解釋,爲什麼,即使upvote,這是否有用? –

1

在第一種情況下,你正在做

int balance = 327; 
int rate = 5; 
balance += balance * (rate/100); 

當你司int結果也是整型,所以師rate/100的結果是(int)rate/100什麼讓(int)0.05這是0。這就是爲什麼balance += balance * 0這就是爲什麼平衡在第一個程序中沒有改變的原因。

當您將變量和參數更改爲double時,沒有截斷值,因此所有計算都按照您的預期進行。

0

這是初學者的經典問題。我很驚訝,我找不到一個很好的解釋。這一個是有點幫助:

Why is the result of 1/3 == 0?

在Java中怎麼樣劃分執行操作(/)取決於類型的操作數。 a/bab是操作數。如果你用整數除整數,它將執行整數除法。意味着取整數部分並丟棄餘數。在該方法中,(56/100) == 0但是(156/100) == 1沒有舍入。

要強制浮點運算確保一個操作數爲double例如嘗試:

void addInterest(int rate) { 
    balance += balance*(rate/100.0); 
} 

編譯器將解釋100.0double然後在浮點運算執行計算(可能是你所期待)然後取整數值加到balance

腳註1:從不使用double作爲貨幣值。在double算術中存在一些舍入奇數,導致財務計算中出現問題。 double不能準確地代表0.01,例如(0.01+0.01+0.01+0.01+0.01+0.01)!=0.06時累積舍入誤差不可避免地會造成一些混淆。 你可以用公差來模糊它,但在任何實際大小的金融系統中,你最終都會走出去。

腳註2:爲什麼Java這樣工作?整數算術對於許多算法很有用,並且在執行上述6次操作之後,執行數百萬次遞增的循環將永遠不會「漂移」,就像我們可以看到的那樣發生!

1

第一個程序不會在第二個程序中更改餘額 的最終值。這是什麼原因?

這是所有關於雙對整數算術。

void addInterest(double rate) { 
    balance += balance*(rate/100); 
} 

在第二方案,當調用addInterest(double rate),然後balance*(rate/100)將被計算從main()通過將型鑄造成double變量(它是由addInterest方法簽名定義的類型)的的rate值和象下面這樣:

ratedouble率/ 100 = 5/100 = 0.05

但是,當rateinteger率/ 100 = 5/100 = 0(intgers去除所有小數)

1

如果聲明兩個變量爲整數,將它們劃分:

int a = 4; 
int b = 5; 
System.out.println(a/b); 

你」將不是得到0.8。

在Java中,除以整數的整數總是整數而且由於數學結果,0.8是不是整數,則四捨五入得到0。如果你想要得到的結果0.8,您需要使a或ba雙重。

代碼1,您addInterest方法獲取的5一個參數值且發生這種情況:

balance += balance*(rate/100); 

由於rate100都是整數,結果必須是整數。因此,數學結果0.05被舍入爲0。衆所周知,任何乘以0的值都是0.因此,在評估右側後,賦值語句如下所示:

balance += 0; 
相關問題