在执行数学运算以开发用于简单计算器的Android应用程序时,导致减法和除法运算的奇怪结果 . 其他操作与提供的输入相得益彰 . 在我的精确处理研究中,遇到了BigDecimal类,减少了我的错误 .
某些操作,如减法和除法,都没有产生适当的结果 . 我在这里提供代码片段 .
.
.
.
String answer = "";
BigDecimal bigDecimal1, bigDecimal2;
BigDecimal bigDecimalResult;
String operation = "";
.
.
.
case R.id.button_substraction:
bigDecimal1 = new BigDecimal(answer);
operation = "-";
answer = "";
textViewAnswer.setText(buttonSubstraction.getText().toString());
break;
case R.id.button_division:
bigDecimal1 = new BigDecimal(answer);
operation = "/";
answer = "";
textViewAnswer.setText(buttonDivision.getText().toString());
break;
case R.id.button_equal:
bigDecimal2 = new BigDecimal(answer);
answer = "";
switch (operation) {
.
.
case "-":
bigDecimalResult = (bigDecimal1.subtract(bigDecimal2)).setScale(6,RoundingMode.HALF_UP).stripTrailingZeros();
textViewAnswer.setText(bigDecimalResult.toString());
break;
case "/":
bigDecimalResult = (bigDecimal1.divide(bigDecimal2)).setScale(6,RoundingMode.HALF_UP).stripTrailingZeros();
textViewAnswer.setText(bigDecimalResult.toString());
break;
}
.
.
.
例:
- 减法
当从自身中减去一个数字时,它的精度值为6(在代码中设置)为0,
100 - 100 = 0.000000
即使指定了stripTrailingZeros() .
- 师
试图分裂
1/9
崩溃我的应用程序 .
-
逻辑实现出错了吗?
-
当使用BigDecimal类时,它是否与内存中的存储表示有关?
1 回答
在Java 8中修复了
stripTrailingZeros()
没有剥离零值的问题 .见JDK-6480539: BigDecimal.stripTrailingZeros() has no effect on zero itself ("0.0")
1 / 9
崩溃您的应用程序的问题是由您的逻辑引起的:您正在尝试在除法后设置比例,但
1 / 9
没有确切的值,因此divide()方法会抛出异常,如javadoc中所述 .您应该调用divide()方法的其他重载之一:
现在,要注意
stripTrailingZeros()
的结果 . 例如 . 如果结果为100.00000
,则stripTrailingZeros()
将逐字地删除所有零,从而产生1E+2
. 这可能不是你想要的 .要以更易读的方式打印,您可能需要使用toPlainString()而不是toString() .