Java 除法大小数

Java 除法大小数,java,bigdecimal,Java,Bigdecimal,试图处理大小数。 尝试将大小数除以3(结果是一个周期值)时收到算术异常 如果我使用指定位数的舍入:如果是10/3,我将收到正确的结果3.3333, 但如果是10/8,我将收到1.25000000美元。我希望在第一种情况下收到3.33333333和1.25 有一个普遍的解决办法吗 我的代码是: BigDecimal b1 = new BigDecimal("10"); BigDecimal b2 = new BigDecimal("3"); try { // updated Bi

试图处理大小数。 尝试将大小数除以3(结果是一个周期值)时收到算术异常

如果我使用指定位数的舍入:如果是10/3,我将收到正确的结果3.3333, 但如果是10/8,我将收到1.25000000美元。我希望在第一种情况下收到3.33333333和1.25

有一个普遍的解决办法吗

我的代码是:

BigDecimal b1 = new BigDecimal("10");
BigDecimal b2 = new BigDecimal("3");

try {
    // updated
    BigDecimal b3 = b1.divide(b2, 8, RoundingMode.HALF_UP);
    System.out.println(b3.toString());
} catch (ArithmeticException e) {
    System.out.println("Oops");
}

您需要一个RoundingMode,例如:

BigDecimal b3 = b1.divide(b2, 2, RoundingMode.HALF_UP);
所有解释如下:

使用您的解决方案b3=b1。除法(b2,8,取整模式。半向上);(8位数字)。它在10/3的情况下工作正常,但在10/8的情况下,我收到结果1.25000000。我想在第一种情况下收到3.8888888,在第二种情况下收到1.25。如何做到这一点

您需要一个额外的静态助手方法,即我的完整解决方案:

import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalDivider {

    public static BigDecimal divideAutoScale(BigDecimal val1, BigDecimal val2,
            int scale, RoundingMode roundingMode) {
        BigDecimal result = val1.divide(val2, scale, roundingMode);
        return result.setScale(countScale(result));
    }

    /*
     * Static helper method, returns int scale.
     */

    private static int countScale(BigDecimal bd) {

        if (bd.doubleValue() % 2 == 0) {
            return 0;
        } else {

            String bigDec = bd.toString();
            int counter = 0;

            for (int i = bigDec.length() - 1; i >= 0; i--) {

                if (bigDec.charAt(bigDec.length() - 1) != '0') {
                    break;
                }

                if (bigDec.charAt(i) == '0') {
                    counter++;
                }

                if (bigDec.charAt(i) == '.'
                        || (i > 1 && bigDec.charAt(i) == '0' && bigDec
                                .charAt(i - 1) != '0')) {
                    break;
                }
            }

            return bigDec.substring(bigDec.indexOf('.'), bigDec.length() - 1)
                    .length() - counter;
        }
    }

    /*
     * Example of usage
     */

    public static void main(String[] args) {
        BigDecimal b1 = new BigDecimal("10");
        BigDecimal b2 = new BigDecimal("5");

        BigDecimal result = divideAutoScale(b1, b2, 4, RoundingMode.HALF_UP);
        System.out.println(result);
    }
    }
结果:5

其他测试:

10/3:3.3333


10/8:1.25

四舍五入只是一种选择。我不会说这是一般的“答案”。如果底层应用程序的需求实际上是不舍入的呢?如果“此处解释全部”,那么这里是一个副本。不要发布答案,而是将此问题标记为重复。(顺便说一句,谢谢你发现了这个问题。)我已经回答了,因为很难找到这样的答案,这个话题在某些情况下更有意义。这将有助于将来发现这个问题。@RichardK不,那样做是错误的。这个问题将继续存在,并将作为复制品的标志牌。为了达到这个目标,它不需要答案。好的,对不起。我会记住这一点。我投反对票——在发布这个问题之前,没有任何证据表明之前进行过研究。这里更确切地说:取整是解决当前问题的一种方法;但这不是唯一的选择。这取决于你的课程要求。可能存在舍入错误的情况;相反,错误需要传播。