2013-10-10 63 views
0

我有該計算這是目前在JavaScript和這裏後產生許多一些代碼行是代碼:從JavaScript轉換爲Java,但沒有給予相同的輸出

if (y2 != y1) 
{ 
    // calculate rate 
    var f; 
    var y; 
    if (y2 > y1) 
    { 
     f = cpi[y2]/cpi[y1]; 
     y = y2 - y1; 
    } 
    else 
    { 
     f = cpi[y1]/cpi[y2]; 
     y = y1 - y2; 
    }   
    var r = Math.pow(f, 1/y); 
    r = (r-1)*100; 
    r = Math.round(r*100)/100; 
    System.out.println("number: " + r.toFixed(2) + "%."); 
} 

我轉換上述JS代碼Java和這裏是代碼:

DecimalFormat decimalFormat = new DecimalFormat("0.##"); 
    if (cpi[to] != cpi[from]) { 
     double f, y; 
     if (cpi[to] > cpi[from]) { 
      f = cpi[to]/cpi [from]; 
      y = to - from; 
     } 
     else { 
      f = cpi[from]/cpi[to]; 
      y = from - to; 
     } 
     q = Math.pow(f, 1/y); 
     q = (q-1)*100; 
     q = Math.round(q*100)/100; 
     Toast.makeText(getApplicationContext(), "number: " + String.valueOf(decimalFormat.format(q)), 2000).show(); 
    } 

的JavaScript代碼產生:number: 2.39

雖然Java代碼產生number: 2

爲什麼我會得到兩個不同的值?如果需要,我會發布cpi[to]cpi[from],tofrom的值。

+2

q被聲明爲雙重地方? –

+1

請發佈'cpi'的定義,也許它是一個'int []',整數除法是一個商。 – rgettman

+1

嘗試改變'q =(q-1)* 100.0;'和'q = Math.round(q * 100.0)/100.0;' – fvdalcin

回答

2

在這一行

q = Math.round(q*100)/100; 

除法運算的兩個操作數都是一體的,因此其結果是也整型。使用100.0作爲除數來強制結果爲double

+0

你說得對。我不能接受答案,因爲SO:/! –

1

什麼是q type? 嘗試把100.0也

+0

100.0幫助!謝謝。 –

1

如果你在java中分兩個整數,結果是整數。每個具有雙精度和整數或雙精度的運算都會產生雙精度。

1)在這一行

1)q = Math.round(q*100)/100; 

2)你正在deviding兩個整數,因此具有相同的輸出爲:

2)q = (int) (Math.round(q*100)/100); 

3),可以使用鑄造加倍例如:

3)q = Math.round(q*100)/(double)100; 

4)或使用使該數字加倍的100.0:

4)q = Math.round(q*100)/100.0; 

5)這應該工作也是如此,因爲第一Math.round的結果被轉換爲double,然後通過100 devided:

5)q = (double)Math.round(q*100)/100; 

6)然而,這將不會工作,因爲第一數學。整數除以100,它創建整數,所以這個操作的結果被捨去,之後被轉換爲雙倍。所以它會增加一倍,但仍然下降,因爲它在它變成雙倍之前被舍入。

6)q = (double)(Math.round(q*100)/100); 
+0

如果我有貨幣,我想強制。##總是。我怎樣才能做到這一點?我會爲此提出一個新問題。 –

+0

您必須有一個變量double或casted來加倍。例如:double result = a /(double)b – libik

0

最有可能您的問題Math.round(double)返回long值。因此d將包含long而不是雙倍。

相關問題