Основная проблема в том, что 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"));
}