如何在Java中使用for循环递增BigDecimal?

7
我应该如何在Java中通过for循环增加BigDecimal? 以下是我目前正在运行的代码,我不明白为什么它不能递增BigDecimal实例。
package app;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class Test {
    private List<BigDecimal> ticketQuantity = new ArrayList<>();
    List<String> someNumber = new ArrayList<>();

    public Test() {

        ticketQuantity.add(new BigDecimal(0));
        ticketQuantity.add(new BigDecimal(0));
        ticketQuantity.add(new BigDecimal(0));
        ticketQuantity.add(new BigDecimal(0));

        someNumber.add("10");
        someNumber.add("10");
        someNumber.add("10");
        someNumber.add("10");
        System.out.println(ticketQuantity);

        int i = 0;
        for (BigDecimal x : ticketQuantity) {
            x.add(new BigDecimal(someNumber.get(i)));
            i++;
        }

        System.out.println(ticketQuantity);
    }

    public static void main(String[] args) {
        new Test();
    }
}

我错过了什么?我希望someNumber应该等于[10, 10, 10, 10],但是却打印出了[0, 0, 0, 0] :(


BigDecimal是不可变的。请阅读API。 - Michael Markidis
3个回答

15

BigDecimal代表:

不可变的、任意精度的有符号十进制数

不可变性意味着您无法修改实例。 add 方法将返回一个 新的 BigDecimal。如果您想更改列表中的值,您必须通过索引循环并调用 List.set,将要替换的索引和 BigDecimal.add 的结果作为参数传入:

for (int i = 0; i < ticketQuantity.size(); i++) {
    ticketQuantity.set(i, ticketQuantity.get(i).add(someNumber.get(i)));
}

你能给我一些代码示例吗?但是我想要增加先前的值,set 命令基本上会用新值覆盖它。 - postsrc

2

如其他答案所解释的那样,add() 方法将返回一个新的 BigDecimal,并且不会修改原始实例,因为 BigDecimal 是不可变的,所以您需要按照以下方式进行操作:

int i = 0;
for (BigDecimal x : ticketQuantity) {
    x = x.add(new BigDecimal(someNumber.get(i)));
    ticketQuantity.set(i, x);
    i++;
}

0

正如其他人所说,BigDecimal是一个不可变的类。方法BigDecimal#add实际上返回另一个BigDecimal实例,而不是更新操作数BigDecimal对象。为了实现您的目标,您可以尝试以下方法:

public class Test {
    private List<BigDecimal> ticketQuantity = new ArrayList<>();
    List<String> someNumber = new ArrayList<>();

    public Test() {

        someNumber.add("10");
        someNumber.add("10");
        someNumber.add("10");
        someNumber.add("10");
        System.out.println(ticketQuantity);

        for (String x : someNumber) {
            ticketQuantity.add(new BigDecimal(x));
        }

        System.out.println(ticketQuantity);
    }

    public static void main(String[] args) {
        new Test();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接