2012-09-07 89 views
1

我正在使用android計算器。用戶按1到9和小數點的按鈕,然後inputnum(arraylist)將解析顯示器作爲輸入,然後運行,然後顯示答案。相關代碼如下:Android計算器減法

ArrayList<Double> inputnum = new ArrayList<Double>(); 
double inputnum1; 
double inputnum2;  

... 


inputnum.add(Double.parseDouble(Fakedisplay.getText().toString()));   
case SUBTRACT: 
     inputnum1 = inputnum.get(0); 
     inputnum2 = inputnum.get(1); 
     inputnum.removeAll(inputnum); 
     inputnum.add(inputnum1 - inputnum2); 

     Fakedisplay.setText(String.format("%.19f", inputnum.get(0)));    

     String strf2=Fakedisplay.getText().toString(); 
     String strippedf2 = Double.valueOf(strf2).toString(); 
     if (strippedf2.endsWith(".0")) 
      strippedf2 = strippedf2.substring(0, strippedf2.length() - 2); 
     Fakedisplay.setText(strippedf2); 

問題: 爲1000.84 - 1000.01它將給0.830000000000041,這是不希望對演示文稿, 然而,這個問題僅僅只出現了減法,一模一樣的附加編碼,乘法和除法,但工作得很好,即:1000.84 + 1000.01呈現2000.85且不多,1000.84 * 1000.01 = 1000850.0084且不多,1000.84/1000.01也可正常顯示。

爲什麼減法這麼特別?如何處理它?

+0

有啥問題? –

+0

問題是:如何提供0.83而不是0.83000000041的確切答案。這是因爲它適用於+,x,/除了減法。我想知道爲什麼減法是如此特別,看看是否有辦法解決和作出更好的演示0.83大幅 – pearmak

+0

非常感謝您的及時回覆! – pearmak

回答

1

嘗試十進制格式以顯示長達N個十進制數字的值。

DecimalFormat round = new DecimalFormat ("###.##"); 
String output = round.format(inputnum.get(0)); 
Fakedisplay.setText(output); 

輸出= 0.83 0.830000000000041

+0

它的工作原理!抱歉,這樣簡單的事情......哈哈......我太新了,學習編碼〜非常感謝! – pearmak

1

數學計算正在通過二進制計算執行。沒有多少小於1的數字可以完全用二進制表示,這就是爲什麼你會收到你奇怪的結果 - 它們是最好的解釋表示。

如果你想避免這個問題,我會建議使用十進制而不是雙精度(因爲十進制與基本10而不是基數2一起工作)。另一種選擇是使用Math.Round來獲得更準確的計算。另一個建議(但可能最不精確)是將最終結果顯示爲一個字符串,然後在第二個小數位後截斷所有值。