#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);
тогда.