Java 如何计算BigDecimal

Java 如何计算BigDecimal,java,Java,我创建这个JUnit测试是为了测试如何从具有值BigDecimal的对象计算所有值 import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.logging.Level; import java.util.logging.Logger; import or

我创建这个JUnit测试是为了测试如何从具有值BigDecimal的对象计算所有值

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.Test;

public class BigDecimalTest
{
    private BigDecimal sumAmounts(List<ExpressCheckout> myList)
    {
        BigDecimal total = new BigDecimal(BigInteger.ZERO);
        for (ExpressCheckout item : myList)
        {
            total.add(item.getAmount());
        }
        return total;
    }

    @Test
    public void testBigDecimalTest()
    {
        try
        {
            List<ExpressCheckout> list = new ArrayList<>();
            for (int i = 0; i < 12; i++)
            {
                ExpressCheckout obj = new ExpressCheckout();
                obj.setCurrency("USD");

                Random rand = new Random();

                int n = rand.nextInt(50) + 1;
                obj.setAmount(new BigDecimal(n));
                obj.setQuantity(1);
                obj.setName("test name");
                obj.setDescription("test description");
                list.add(obj);
            }

            BigDecimal sumAmounts = sumAmounts(list);

            System.out.println(">>>>>>>>>>>>>>>>>>>> sumAmounts " + sumAmounts.toString());

        }
        catch (Exception ex)
        {
            Logger.getLogger(BigDecimalTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public class ExpressCheckout
    {
        String currency;
        BigDecimal amount;
        int quantity;
        String name;
        String description;

        public ExpressCheckout()
        {
        }

        public ExpressCheckout(String currency, BigDecimal amount, int quantity, String name, String description)
        {
            this.currency = currency;
            this.amount = amount;
            this.quantity = quantity;
            this.name = name;
            this.description = description;
        }

        public String getCurrency()
        {
            return currency;
        }

        public void setCurrency(String currency)
        {
            this.currency = currency;
        }

        public BigDecimal getAmount()
        {
            return amount;
        }

        public void setAmount(BigDecimal amount)
        {
            this.amount = amount;
        }

        public int getQuantity()
        {
            return quantity;
        }

        public void setQuantity(int quantity)
        {
            this.quantity = quantity;
        }

        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            this.name = name;
        }

        public String getDescription()
        {
            return description;
        }

        public void setDescription(String description)
        {
            this.description = description;
        }
    }

}
import java.math.BigDecimal;
导入java.math.biginger;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入org.junit.Test;
公共类大小数
{
私有BigDecimal金额(列表myList)
{
BigDecimal总计=新的BigDecimal(BigInteger.ZERO);
用于(ExpressCheckout项目:myList)
{
总计.add(item.getAmount());
}
返回总数;
}
@试验
公共无效测试BigDecimalTest()
{
尝试
{
列表=新的ArrayList();
对于(int i=0;i<12;i++)
{
ExpressCheckout obj=新建ExpressCheckout();
目标设定货币(“美元”);
Random rand=新的Random();
int n=兰特nextInt(50)+1;
对象设置金额(新的大十进制数(n));
对象设置数量(1);
对象集合名称(“测试名称”);
对象设置说明(“测试说明”);
列表。添加(obj);
}
BigDecimal sumAmounts=sumAmounts(列表);
System.out.println(“>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>summants”+summants.toString());
}
捕获(例外情况除外)
{
Logger.getLogger(BigDecimalTest.class.getName()).log(Level.SEVERE,null,ex);
}
}
公共类ExpressCheckout
{
字符串货币;
大十进制数;
整数;
字符串名;
字符串描述;
公共ExpressCheckout()
{
}
public ExpressCheckout(字符串货币、BigDecimal金额、整数数量、字符串名称、字符串描述)
{
这个。货币=货币;
这个。金额=金额;
这个。数量=数量;
this.name=名称;
this.description=描述;
}
公共字符串getCurrency()
{
返回货币;
}
公共无效设置货币(字符串货币)
{
这个。货币=货币;
}
公共BigDecimal getAmount()
{
退货金额;
}
公共作废设置金额(大十进制金额)
{
这个。金额=金额;
}
公共整数getQuantity()
{
退货数量;
}
公共无效设置数量(整数数量)
{
这个。数量=数量;
}
公共字符串getName()
{
返回名称;
}
公共void集合名(字符串名)
{
this.name=名称;
}
公共字符串getDescription()
{
返回说明;
}
公共void集合描述(字符串描述)
{
this.description=描述;
}
}
}
出于某种原因,我得到了结果
summounts 0
知道我为什么得到这个结果以及如何修复它吗?
应根据Java列表中的所有BigDecimal值计算结果。

BigDecimal
在Java中是不可变的,因此您在
sumAmounts
方法中的语句如下:

total.add(item.getAmount());
需要更改为:

total = total.add(item.getAmount());

java中的
BigDecimal
是不可变的,因此您在
sumAmounts
方法中的语句如下所示:

total.add(item.getAmount());
需要更改为:

total = total.add(item.getAmount());

而不是
BigDecimal total=新的BigDecimal(biginger.ZERO)写入如下:
BigDecimal total=BigDecimal.ZERO。。。无需每次创建一个新对象,零的对象已经存在。而不是
BigDecimal total=new BigDecimal(biginger.zero)写入如下:
BigDecimal total=BigDecimal.ZERO。。。无需每次都创建一个新对象,零的对象已经存在。