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

尝试十进制格式以显示最多 N 个十进制数字的长值。

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

输出 = 0.83 为 0.830000000000041

于 2012-09-07T10:57:14.073 回答
1

数学计算是通过二进制计算进行的。没有多少小于 1 的数字可以用二进制精确表示,这就是为什么你会收到奇怪的结果——它们是最好的解释表示。

如果你想避免这个问题,我建议使用 Decimal 而不是 Double(因为 decimal 使用 base 10 而不是 base 2)。另一种选择是使用 Math.Round 来获得更准确的计算。另一个建议(但可能是最不精确的)是将最终结果显示为字符串,然后截断小数点后第二位的所有值。

于 2012-09-07T10:54:03.637 回答
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 回答