String.format (%. 2f, double) работает только в половине тестов

Я пытаюсь отформатировать двойные значения, чтобы у них было только 2 десятичных пробела:

remainingAmount = Double.parseDouble(String.format("%.2f",remainingAmount - calculatePrincipalPayment()));

Как вы можете видеть, этот код форматирует двойное значение remainingAmount - calculatePrincipalPayment() с помощью String.format(), затем передает его из String в Double и присваивает его двойной переменной unknownAmount (которая была объявлена). remainingAmount удваивается, а calculatePrincipalPayment() возвращает удвоение.

Проблема в том, что он форматирует только часть значений, например, он может возвращать 401,37 (что является обязательным форматированием), а также 403,71999999999997. Я также уже пытался выполнить форматирование с помощью DecimalFormat df = new DecimalFormat ("#. ##").

У double нет формата, есть только строки, поэтому при синтаксическом анализе он не делает того, что вы думаете.

Peter Lawrey 23.05.2018 20:45

Если вы запустите свой код для 403.71999999999997, вы получите 403.72. Можете ли вы привести пример, который дает результат, который вы имеете в виду?

Peter Lawrey 23.05.2018 20:46

Добро пожаловать в SO! Первое, что я замечаю, это то, что вы переходите от двойника к строке к двойнику в одной строке. Нет необходимости переходить к строке, пока вы, наконец, не будете готовы к печати. Отредактируйте свой пост, чтобы создать Минимальный, полный и поддающийся проверке пример вашего кода вместе с примерами входных и выходных данных, чтобы мы могли лучше вам помочь.

Stephan 23.05.2018 20:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
266
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

double (или его аналог Double в штучной упаковке) не имеет емкости для хранения определенного формата, который будет использоваться при рендеринге в виде строки. Это просто необработанное значение.

Я подозреваю, что вы полагаете, что значение double, полученное путем синтаксического анализа из определенного формата, каким-то образом сохраняет этот формат. Это не тот случай.

Типы с плавающей запятой неточны; не все значения можно точно сохранить. В случаях, когда точное значение не может быть сохранено, используется ближайшее сохраняемое значение - как в случае с некоторыми из ваших результатов.

Другие вопросы по теме