2012-04-13 2 views
1

Привет, У меня возникла проблема при создании калькулятора изменений для школьного задания. По сути, это вычисление наименьшего количества изменений, необходимых для определенной суммы денег.Ошибка округления?

  • Исх. $ 5,36:
  • 2 Мультяшки Toon (2 $)
  • 1 Луни (1 $)
  • 1 квартал
  • 1 цент
  • 0 никелевые
  • 1 пенни

я заявил вся моя переменная должна быть удвоена, поэтому я могу рассчитать значения и общие суммы. Кажется, что он отлично работает на целых числах (5,00, 6,00, 7,00), но беспорядок, когда я добавляю десятичное место. Например, когда я говорю $ 5,25, он должен сказать 2 человека-одиночки и 1 квартал. Я думаю, что это может быть ошибка в округлении или что-то не так с моими расчетами. Любая помощь приветствуется. Ниже приведены расчеты кода:

//Rounding to one number   
DecimalFormat oneDigit = new DecimalFormat ("#,0"); 

//Ask user for input 
String moneyinput = JOptionPane.showInputDialog ("Welcome to the Change Caluculator. " 
       + "Please Enter your amount of money in Dollars ($): "); 

//Take user input and create into string. 
totmoney = Double.parseDouble (moneyinput); 

//Calculate number of toonies 
numtoonies = (totmoney/toonieval); 

System.out.println ("There is a total of " + oneDigit.format (numtoonies) + " toonies."); 

//Find new amount 
totmoney = (totmoney%toonieval); 

//Calculate the number of loonies 
numloonies = (totmoney/loonieval); 

//Find new amount 
totmoney = (totmoney-numloonies); 

System.out.println ("There is a total of " + oneDigit.format (numloonies) + " loonies."); 

//Calculate number of quarters 
numquarters = (totmoney/quarterval); 

//State the about of Coins 
System.out.println ("There is a total of " + oneDigit.format (numquarters) + " quarters."); 
} 
+0

Мне сказали использовать Decimalformat, чтобы при выполнении вычисления Я получаю целое число на выходе вместо десятичного. Я думаю, что делаю все правильно в вычислениях, но я получаю странный ответ, когда его не целое число. – Dave555

ответ

3

Я не совсем понимаю, почему вы используете DecimalFormat вообще. Вы должны решить эту проблему с помощью только мод % и деления /.

Это, как я хотел бы подойти к этой проблеме:

  1. Возьмите входной сигнал от пользователя (как двойной в формате 5.33)
  2. Сохранить, что в междунар путем перемещения знака после запятой (INT значение = Стоимость * 100)
  3. Найти число Мультяшки Toon с помощью деления (numToonies = значение/toonieval)
  4. Найти оставшееся количество денег (= значение% toonieval)
  5. Повторите шаги 3 и 4 для других логово ominations

Примечание: вы должны изменить значение Мультяшки Toon, чтобы отразить тот факт, что цена, которую вы использовали, была умноженной на 100.

+0

@sarnold Я использовал неправильное имя переменной, я исправил их. – twain249

+0

Хорошо, я думаю, у вас это есть прямо сейчас. Благодаря! – sarnold

1

Я не думаю, что это правильно работает для чисел с плавающей точкой :

totmoney = (totmoney%toonieval); 

Попробуйте

totmoney = totmoney - toonieval*numtoonies; 

вместо этого.

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

+0

Что бы это сделать, если 'totmoney' в десять или сто раз больше, чем' toonieval'? – sarnold

+0

@sarnold - Не уверен, что я понимаю ваш вопрос. Если вы спрашиваете о моем предложении aftert «Try»: на основе объяснения OP значение toonie составляет 2 доллара, поэтому «toonieval * 2» является долларовым значением количества тонов - по сути, таким же, как и модуль, но оставляет дробную часть незатронутой. – Attila

+0

@Attila Я думаю, что вопрос, который он привлекал, это «toonieval = 2» и «numtoonies» - количество используемых toonies. По крайней мере, так оно и есть, если я правильно его читаю. – twain249

1

Не используйте числа с плавающей запятой, если вам нужна абсолютная точность. Спецификация с плавающей точкой IEEE, в которой java следует четным состояниям, что будет потеря точности, поскольку спецификация с плавающей запятой не может правильно представлять все операции с плавающей запятой, она может только аппроксимировать их.Решение для этого состоит в том, что вам нужно сохранить значение в 2 ints, один для суммы слева от десятичной и один для значения справа от десятичной.