2012-09-07 76 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来获得更准确的计算。另一个建议(但可能最不精确)是将最终结果显示为一个字符串,然后在第二个小数位后截断所有值。