Java NumberFormat在“UP”模式下未正确舍入

时间:2018-05-04 17:49:02

标签: java android kotlin

此测试失败:

@Test
fun testFormatRoundedUp() {
  val formatter = NumberFormat.getCurrencyInstance()
  formatter.maximumFractionDigits = 0
  formatter.roundingMode = UP
  formatter.currency = Currency.getInstance("USD")
  val decimal = 1 / 100.toDouble()
  assertThat(formatter.format(decimal)).isEqualTo("$1")
}

实际输出为“$ 0”。 “UP”不是我想要的舍入模式吗? AFAICT来自文档,它是。当我连接调试器时,decimal0.01,所以这似乎不是问题。我也试过非货币数字格式,它有相同的行为

1 个答案:

答案 0 :(得分:0)

主要问题是RoudingMode

  

每个舍入模式指示如何计算舍入结果的最低有效返回数字。

因此,换句话说,0.01四舍五入为0.1(最低有效数字为四舍五入)......当您将setMaximumFractionDigits设为0时,所有丢弃十进制数字只留下0

所以,你必须实现一些逻辑来将数字四舍五入,如果你想要舍入两个不太重要的数字(或搜索如何做...我现在正在搜索,我可能会在稍后更新这个答案)。< / p>

<强>更新

使用BigDecimal可以实现您想要的效果。它支持您想要的“递归回合”操作。在java中,您的代码将变为:

@Test
public void testFormatRoundedUp() {
    NumberFormat formatter = NumberFormat.getCurrencyInstance();
    formatter.setMaximumFractionDigits(0);
    formatter.setCurrency(Currency.getInstance("USD"));

    double decimal = 1 / 100.0;
    BigDecimal decimalValue = new BigDecimal(decimal);

    Assert.assertThat("Format: 0.01", formatter.format(decimalValue.setScale(0, RoundingMode.UP)), equalTo("US$ 1"));
}