Java NumberFormat некорректно округляется в режиме «UP» - PullRequest
0 голосов
/ 04 мая 2018

Этот тест не пройден:

@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 из документов, это так. decimal - это 0.01, когда я подключаю отладчик, так что это не проблема. Я также пробовал не денежный формат номера и он имеет такое же поведение

1 Ответ

0 голосов
/ 04 мая 2018

Основная проблема в том, что RoudingMode:

В каждом режиме округления указывается, как вычисляется наименее значимое возвращаемое число округленного результата.

Таким образом, другими словами, 0.01 округляется до 0.1 (округляется наименее значимая цифра) ... И когда вы устанавливаете setMaximumFractionDigits в 0, все десятичные цифры отбрасываются, оставляя только 0

Итак, вы должны реализовать некоторую логику, чтобы округлять число дважды, если вы хотите округлить две менее значащие цифры (или искать, как это сделать ... Я сейчас ищу, и позже могу обновить этот ответ).

Обновление

Можно достичь того, что вы хотите, используя 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"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...