【问题标题】:BigDecimal scale not workingBigDecimal 比例尺不起作用
【发布时间】:2015-01-29 13:42:47
【问题描述】:

我有以下代码:

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 评估不会影响结果。怎么了?

【问题讨论】:

    标签: java bigdecimal


    【解决方案1】:

    #setScale documentation 的重要部分是这样的:

    请注意,由于 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
    

    您需要将返回的BigDecimal 调用的#add 实例存储在一个变量中。

    【讨论】:

      【解决方案2】:

      您更改了result 的比例,但没有更改amountSum 或amountByCurrency 的比例,因此当您使用此变量进行操作时,您使用的是比例0。

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

      【讨论】:

      • BigDecimal 是不可变的,所以什么都没有改变。
      • 在每个 BigDecimal 实例化(在每个操作上)上重新计算比例
      猜你喜欢
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多