我有以下代码:
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调用实例存储在变量中.
| 归档时间: |
|
| 查看次数: |
2928 次 |
| 最近记录: |