首页 文章

数学运算的意外结果

提问于
浏览
-1

在执行数学运算以开发用于简单计算器的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 回答

  • 1

    在Java 8中修复了 stripTrailingZeros() 没有剥离零值的问题 .
    JDK-6480539: BigDecimal.stripTrailingZeros() has no effect on zero itself ("0.0")

    1 / 9 崩溃您的应用程序的问题是由您的逻辑引起的:

    bigDecimalResult = bigDecimal1.divide(bigDecimal2)
                                  .setScale(6, RoundingMode.HALF_UP)
                                  .stripTrailingZeros()
    

    您正在尝试在除法后设置比例,但 1 / 9 没有确切的值,因此divide()方法会抛出异常,如javadoc中所述 .

    如果精确商不具有终止十进制扩展,则抛出ArithmeticException

    您应该调用divide()方法的其他重载之一:

    bigDecimalResult = bigDecimal1.divide(bigDecimal2, 6, RoundingMode.HALF_UP)
                                  .stripTrailingZeros()
    

    现在,要注意 stripTrailingZeros() 的结果 . 例如 . 如果结果为 100.00000 ,则 stripTrailingZeros() 将逐字地删除所有零,从而产生 1E+2 . 这可能不是你想要的 .

    要以更易读的方式打印,您可能需要使用toPlainString()而不是toString() .

相关问题