BigDecimal的scale方法不起作用

5

我有以下代码:

BigDecimal result = BigDecimal.ZERO;
result.setScale(2, BigDecimal.ROUND_FLOOR); //1
BigDecimal amountSum;

// amount sum computation

BigDecimal amountByCurrency = amountSum.divide(32); //-0.04
result.add(amountByCurrency); //2

//1行后,比例尺仍然是0。为什么?因此,//2的评估对结果没有影响。有什么问题吗?

2个回答

16
重要的部分在于#setScale文档中的这句话:

请注意,由于BigDecimal对象是不可变的,因此调用此方法不会导致原始对象被修改,与通常将名为setX的方法更改字段X的约定相反。 相反,setScale返回具有适当比例的对象; 返回的对象可能是新分配的,也可能不是。

(已添加强调)

因此,您代码中的这行不会更改result实例:

result.setScale(2, BigDecimal.ROUND_FLOOR); //1

要么将其更改为:

result = result.setScale(2, BigDecimal.ROUND_FLOOR);

要么用新的实例覆盖现有的实例,要么创建一个新变量来代替 result

BigDecimal scaledResult = result.setScale(2, BigDecimal.ROUND_FLOOR);

顺便提一下,这一行也适用:
result.add(amountByCurrency); //2

你需要将#add方法返回的BigDecimal实例存储在一个变量中。

-1

您已更改了result的比例,但未更改amountSumamountByCurrency的比例,因此在操作这些变量时,您正在使用比例0。

如果我没记错的话,在创建BigDecimal时有一种“全局”方法可以设置默认比例。您应该使用此方法,或逐个设置比例变量。


4
BigDecimal 是不可变的,因此什么都没有改变。 - Mark Rotteveel
1
每次创建BigDecimal实例(每次操作)时都会重新计算比例。 - bsiamionau

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