Десятичный формат в java не дает соответствующего результата

#java #decimalformat

Вопрос:

В настоящее время я использую десятичный формат для получения результата с 1 десятичными данными. Результат, который я получил, приемлем, когда значение меньше 9,94 (учитывая диапазон от 1 до 10).

Например

Случай 1 —> новый десятичный формат(«#.#»).формат(9.85) —>> >>9.8 (Хорошо, не округляя)

Случай 2 —> новый десятичный формат(«#.#»).формат(9.86) —>> >>9.9 (Ладно)

Случай 3 —> новый десятичный формат(«#.#»).формат(9.95) —>> >>10 (Не в порядке, как округление)

Случай 4 —> новый десятичный формат(«#.#»).формат(9.96) —>> >>10 (Ладно)

Меня беспокоит, почему случай 1 и случай 3 не ведут себя подобным образом. В случае 1 десятичный формат дает данные как 9,8 для 9,85 без округления, но в случае 3 данные 9,95 округляются и возвращают 10.

Комментарии:

1. new DecimalFormat("#.#").format(9.95) дает мне 9.9 .

2. Десятичный формат наследует метод setRoundingMode.

3. @Не уточняйте, какую версию java вы используете. Если возможно, вы можете опубликовать свой код. Я использую приведенный ниже код distanceFormatter = новый десятичный формат(«#.#»); distanceFormatter.setMinimumFractionDigits(1); distanceFormatter.формат(км)

4. Какой JDK вы используете? Для меня режим округления по умолчанию-HALF_EVEN, а случай 3-9,9 (в Windows Open JDK17).

5. Я использую java 8

Ответ №1:

Javadoc десятичного формата указывает , что по умолчанию используется режим округления RoundingMode.HALF_EVEN , который округляется в сторону «ближайшего соседа», если только оба соседа не находятся на одинаковом расстоянии, и в этом случае округляется в сторону четного соседа.

При необходимости вы можете выбрать другой режим округления.

Ответ №2:

Десятичный формат обеспечивает режимы округления, определенные в режиме округления для форматирования.

По умолчанию он использует RoundingMode.HALF_EVEN.

Режим округления для округления в сторону «ближайшего соседа», если только оба соседа не находятся на равном расстоянии, в этом случае округлите в сторону четного соседа.

Ведет себя как для округления.HALF_UP, если цифра слева от отброшенной дроби нечетная; ведет себя как для округления.HALF_DOWN, если она четная.

Обратите внимание, что это режим округления, который статистически сводит к минимуму совокупную ошибку при многократном применении в последовательности вычислений.

Он иногда известен как «округление банкира» и в основном используется в США.

Этот режим округления аналогичен политике округления, используемой для плавающей и двойной арифметики в Java.

Вы можете установить режим округления с помощью:

 DecimalFormat decimalFormat = new DecimalFormat("#.#");
decimalFormat.setRoundingMode(RoundingMode.CEILING);
 

Режим округления

Комментарии:

1. Использование ПОТОЛКА не поможет, как в вопросе, о котором я упоминал -> Для случая 1 мне нужно значение 9,8, а не 9,9

2. @PraneshSahu используйте setRoundingMode(RoundingMode.DOWN); тогда.