Несоответствие в java.text.DecimalFormat.format с использованием шаблона «###0.00%»JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Несоответствие в java.text.DecimalFormat.format с использованием шаблона «###0.00%»

Сообщение Anonymous »

Я использую шаблон ###0.00% для форматирования процентных значений.
В документации упоминается, что 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%
Очевидно, что способы округления обоих входных данных различны. 0,012350 округляется до 1,23%, тогда как 0,014350 становится 1,44%
Когда я немного отладил форматирование логике, я мог видеть, что во время преобразования двоичного кода в ASCII добавляются некоторые ошибки округления, что приводит к неожиданным проблемам.
пример: для 0.012250, 0.0000000000001, в результате чего значение округляется до 1,23%.
Ниже приведен код из java.text.DigitList< /code>, из которого происходит преобразование ASCII:

Код: Выделить всё

FloatingDecimal.BinaryToASCIIConverter fdConverter  = FloatingDecimal.getBinaryToASCIIConverter(source);
boolean hasBeenRoundedUp = fdConverter.digitsRoundedUp();
И в некоторых случаях hasBeenRoundedUp оказывается истинным, что ограничивает любое дальнейшее округление в рамках метода.
Может кто-нибудь помочь понять, как именно происходит форматирование для вышеупомянутого десятичного формата.


Подробнее здесь: https://stackoverflow.com/questions/793 ... ttern-0-00
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»