BigDecimal规模不起作用

St.*_*rio 2 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
Run Code Online (Sandbox Code Playgroud)

线条//1规模仍然是0.为什么?因此,//2评估不会影响结果.怎么了?

Tom*_*Tom 11

#setScale文档的重要部分是:

请注意,由于BigDecimal对象是不可变的,因此调用此方法不会导致原始对象被修改,这与通常使用名为setX mutate field X的方法的惯例相反.相反,setScale返回具有适当比例的对象; 返回的对象可能会或可能不会被新分配.

(重点补充)

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

result.setScale(2, BigDecimal.ROUND_FLOOR); //1
Run Code Online (Sandbox Code Playgroud)

要么改为:

result = result.setScale(2, BigDecimal.ROUND_FLOOR);
Run Code Online (Sandbox Code Playgroud)

用新的实例覆盖实例,或创建一个新的变量并使用它而不是result:

BigDecimal scaledResult = result.setScale(2, BigDecimal.ROUND_FLOOR);
Run Code Online (Sandbox Code Playgroud)

顺便说一下:同样适用于这一行:

result.add(amountByCurrency); //2
Run Code Online (Sandbox Code Playgroud)

您需要将返回BigDecimal#add调用实例存储在变量中.