我有以下代码:
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
评估不会对结果产生影响。怎么了?
答案 0 :(得分:9)
#setScale
documentation的重要部分是:
请注意,由于BigDecimal对象是不可变,因此调用此方法不会导致原始对象被修改,这与通常使用名为setX mutate field 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
您需要将BigDecimal
调用的#add
实例存储在变量中。
答案 1 :(得分:-1)
您已更改result
的比例,但未更改amountSum
或amountByCurrency
的比例,因此当您使用此变量进行操作时,您使用的是比例0。
如果我记得很清楚,那就是"全球"创建BigDecimal时设置默认比例的方法。您应该使用此方法,或者按变量设置比例变量。