BigDecimal规模不起作用

时间:2015-01-29 13:42:48

标签: java bigdecimal

我有以下代码:

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 个答案:

答案 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的比例,但未更改amountSumamountByCurrency的比例,因此当您使用此变量进行操作时,您使用的是比例0。

如果我记得很清楚,那就是"全球"创建BigDecimal时设置默认比例的方法。您应该使用此方法,或者按变量设置比例变量。