В документации упоминается, что java.text.DecimalFormat использует округление HALF_EVEN режим.
Код: Выделить всё
DecimalFormat df = new DecimalFormat("###0.00%");
List list = List.of(/*input list*/);
String result = list.stream().map(df::format).collect(Collectors.joining(", "));
System.out.print(result);
Код: Выделить всё
0.012050, 0.012150, 0.012250, 0.012350, 0.012450, 0.012550, 0.012650, 0.012750, 0.012850, 0.012950
Код: Выделить всё
1.21%, 1.21%, 1.23%, 1.23%, 1.24%, 1.26%, 1.26%, 1.27%, 1.29%, 1.29%
Код: Выделить всё
0.014050, 0.014150, 0.014250, 0.014350, 0.014450, 0.014550, 0.014650, 0.014750, 0.014850, 0.014950
Код: Выделить всё
1.41%, 1.42%, 1.43%, 1.44%, 1.44%, 1.46%, 1.47%, 1.47%, 1.49%, 1.49%
Когда я немного отладил форматирование логике, я мог видеть, что во время преобразования двоичного кода в ASCII добавляются некоторые ошибки округления, что приводит к неожиданным проблемам.
пример: для 0.012250, 0.0000000000001, в результате чего значение округляется до 1,23%.
Ниже приведен код из java.text.DigitList< /code>, из которого происходит преобразование ASCII:
Код: Выделить всё
FloatingDecimal.BinaryToASCIIConverter fdConverter = FloatingDecimal.getBinaryToASCIIConverter(source);
boolean hasBeenRoundedUp = fdConverter.digitsRoundedUp();
Может кто-нибудь помочь понять, как именно происходит форматирование для вышеупомянутого десятичного формата.
Подробнее здесь: https://stackoverflow.com/questions/793 ... ttern-0-00
Мобильная версия