DecimalFormat не потолок должным образом
В настоящее время мы проводим некоторые тесты, которые включают потолочные числа с двумя десятичными разрядами. Чтобы достичь этого, мы используем Java DecimalFormat.
Тем не менее, тесты дают странные результаты, особенно для случая, когда мы хотим получить число "0,00xxx".
Ниже приведен пример DecimalFormatter, который используется тестами:
DecimalFormat decimalFormatter = new DecimalFormat("#########0.00");
decimalFormatter.setRoundingMode(RoundingMode.CEILING);
Этот тест работает, как и ожидалось, то есть он был правильно настроен:
//The below asserts as expected
@Test
public void testDecimalFormatterRoundingDownOneDecimalPlace3()
{
String formatted = decimalFormatter.format(234.6000000000001);
Assert.assertEquals("Unexpected formatted number", "234.61", formatted);
}
Однако это не так:
//junit.framework.ComparisonFailure: Unexpected formatted number
//Expected :0.01
//Actual :0.00
@Test
public void testSmallNumber()
{
double amount = 0.0000001;
String formatted = decimalFormatter.format(amount);
Assert.assertEquals("Unexpected formatted number", "0.01", formatted);
}
Не могли бы вы объяснить, почему у нас такое поведение? Спасибо
РЕДАКТИРОВАТЬ: еще один тест по запросу комментария. Все еще не работает.
//junit.framework.ComparisonFailure: null
//Expected :0.01
//Actual :0.00
@Test
public void testStackru() throws Exception
{
double amount = 0.0000006;
String formatted = decimalFormatter.format(amount);
Assert.assertEquals("Unexpected formatted number", "0.01", formatted);
}
Я заметил, что для того, чтобы это работало, число больше 0 должно быть в пределах диапазона шаблона. Это ошибка или я что-то упустил?
1 ответ
Похоже, ошибка. Этот код
BigDecimal bd = new BigDecimal("0.0000001");
bd = bd.setScale(2, RoundingMode.CEILING);
System.out.println(bd);
дает правильный результат
0.01