BigDecimal数组的总和始终为零

时间:2019-12-03 07:58:13

标签: java bigdecimal

我在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,但两种方法都给出了相同的零值。

5 个答案:

答案 0 :(得分:4)

更改

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

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

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

答案 1 :(得分:1)

BigDecimal对象是不可变的。 add方法返回一个包含总和的新BigDecimal对象。您会浪费掉这笔款项,并继续使用未修改的初始值。

答案 2 :(得分:1)

如果您查看here,将会看到 files={ 'input.txt':'randy', 'output.txt':'randy', 'code.py':'stan' } k=files.keys() newfiles={value:key for key,value in files.items()} emptylist=[] for key in k: if key not in newfiles.values(): missfile=key valuetoadd=files[missfile] emptylist.append(newfiles[valuetoadd]) emptylist.append(missfile) newfiles[valuetoadd]=emptylist print(newfiles) 的{​​{1}}方法不会更新实例的值,而是返回一个新值。请尝试将add的结果重新影响到变量BigDecimal

add

答案 3 :(得分:0)

请尝试以下操作,而不是sum.add(s);

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

答案 4 :(得分:0)

您还可以像这样对数组进行归约:

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