当前位置: 首页 > 知识库问答 >
问题:

除法大小数[重复]

梁丘缪文
2023-03-14

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

如果我使用指定位数的四舍五入:如果是10/3,我将收到正确的结果3.3333333,但如果是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");
}

共有1个答案

谭昱
2023-03-14

您需要一个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

 类似资料:
  • 我正在进行一个实验,在这个实验中,我们偶尔需要将小数字除以大数字,例如:4/90000。使用double可生成4.444e。我希望BigDecimal可以处理这个算法,并给我一个有意义的小数,但我的实现抛出了一个错误: 错误是: 更新:我对精度至少有3位小数很感兴趣。

  • 下面的代码给了我大约14位小数。我怎样才能把它修剪到小数点后2位?

  • 我正在开发一个android对话框,我打算让它非常灵活地适应不同的手机分辨率。因此,我在构建xml文件时使用了layout_weight属性。 它应该是这样的: 我尝试将最后的Listviews高度更改为match_parent,这不会改变任何东西。当我单击这些项时,listview仍然会消失。

  • 每当我在下面的代码中打印标签大小时,当它在290左右时,我得到0.0作为宽度。 此代码在显示阶段后调用。如何更新标签的宽度?

  • 我知道Android中有一些为特定区域(选项卡、列表等)创建图标的指南,以及根据ldpi、mdpi、hdpi等设置图标大小的方法。 关于如何缩放其他应用内图标有什么规则吗? 我有一个10x10像素的“小”图标,我正在我的mdpi开发手机上使用,创建ldpi、hdpi的缩放规则是什么 谢谢 戴夫

  • 我正在做一个关于复数的项目,来解释更多(a+bi),其中“a”是复数的实部,“b”是它的虚部。(a和b是实数但“i”不是) 我很难实现一个大小方法,而不是返回一个实数,作为一个双倍,我得到无穷大。 这就是我正在尝试实现的内容:(a+bi)=√(a^2+b^2) 我的代码片段 假设实数和虚数都是double.max_value。为什么mag会返回无穷大而不是1.8961503816218352 E1