【问题标题】:Sum of BigDecimal array is always zeroBigDecimal 数组的总和始终为零
【发布时间】:2019-12-03 07:58:13
【问题描述】:

我在 Java 中有一个 BigDecimal 数组,我想计算这个数组中所有元素的总和。我正在尝试以下代码:

    public static void main(String[] args) {
        BigDecimal[] res = {
            new BigDecimal("20849603980134001723930671666823555245252804609722")
           ,new BigDecimal("53503534226472524250874054075591789781264330331690")};
        BigDecimal sum = BigDecimal.ZERO;
        //BigDecimal sum = new BigDecimal("0");
        for(BigDecimal s : res) sum.add(s);
        System.out.println(sum); 
    }

我的问题是 sum 变量为零:

run:
0
BUILD SUCCESSFUL (total time: 0 seconds)

我以两种方式创建了 sum var,但两种方式都给出相同的零值。

【问题讨论】:

    标签: java bigdecimal


    【解决方案1】:

    改变

    for(BigDecimal s : res) sum.add(s);
    

    for(BigDecimal s : res) {
        sum = sum.add(s);
    }
    

    BigDecimal 是一个不可变类,因此add() 返回一个新的BigDecimal 实例,您必须将其分配给您的变量。

    【讨论】:

      【解决方案2】:

      BigDecimal 对象是不可变的。 add 方法返回一个包含总和的新 BigDecimal 对象。你把这个总和扔掉,继续使用你未修改的初始值。

      【讨论】:

        【解决方案3】:

        如果你查看here,你会看到BigDecimaladd 方法并没有更新实例的值,而是返回一个新的值。请尝试将add的结果重新影响到变量sum

        sum = sum.add(s);
        

        【讨论】:

          【解决方案4】:

          您也可以对数组执行归约,如下所示:

          public static void main(String[] args) {
              BigDecimal[] res = { 
                          new BigDecimal("20849603980134001723930671666823555245252804609722"),
                          new BigDecimal("53503534226472524250874054075591789781264330331690") 
                      };
              // use a stream to sum up all the values
              BigDecimal sum = Arrays.stream(res)
                      .reduce(BigDecimal.ZERO, (a, b) -> a.add(b));
              // and print the result
              System.out.println(sum.toString());
          }
          

          这个减少的结果是

          74353138206606525974804725742415345026517134941412
          

          【讨论】:

            【解决方案5】:

            请尝试以下方法而不是 sum.add(s);

            sum = sum.add(s); //循环内

            【讨论】:

            • 这不会向现有答案添加任何内容。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-02
            • 2012-01-16
            • 2020-01-07
            • 1970-01-01
            相关资源
            最近更新 更多