1

私はアンドロイド計算機に取り組んでいます。ユーザーが1〜9のボタンと小数点以下のドットを押すと、inputnum(arraylist)が表示を入力として解析し、次に操作して回答を表示します。関連するコードは次のとおりです。

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も機能し、正しく表示されます。

なぜそれは減算のためにそれほど特別なのですか?それをどのように扱うのですか?

4

3 に答える 3

1

数学計算は、バイナリ計算を介して実行されています。1未満の数値は、バイナリを使用して正確に表現できるものは多くありません。そのため、奇妙な結果が得られます。これらは、最も適切に解釈された表現です。

この問題を回避したい場合は、Doubleの代わりにDecimalを使用することをお勧めします(decimalは基数2ではなく基数10で機能するため)。もう1つの方法は、Math.Roundを使用してより正確な計算を取得することです。もう1つの提案(ただし、おそらく最も精度が低い)は、最終結果を文字列として表示し、小数点以下第2位以降のすべての値を切り捨てることです。

于 2012-09-07T10:54:03.637 に答える
1

10進数形式を試して、N桁までの長い値を表示します。

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

出力=0.8300000000041の場合は0.83

于 2012-09-07T10:57:14.073 に答える
0

これを試してください:http://www.hackpundit.com/android-tutorial-simple-calculator-app/

buttonSub.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mValueOne = Float.parseFloat(edt1.getText() + "");
        mSubtract = true ;
        edt1.setText(null);
    }
});
于 2016-09-03T13:42:15.897 に答える