Решение проблем Java. Это правильно? - PullRequest
2 голосов
/ 24 декабря 2010

С Рождеством всех. У меня есть вопрос до прибытия Санты.

Я новичок в Java, поэтому я просматриваю свою книгу по Java и выполняю упражнения в первой главе.

Вот вопрос, "Написать и приложение, которое определяет стоимость монет в банке и печатает сумму в долларах и центах. Считать целочисленные значения, которые представляют количество четвертей, центов, никелей и пенни." Я действительно сделал эту программу. Но мне интересно, правильно ли я это сделал.

public class PP28 {
  public static void main(String[] args) {

    // cents = pennies.

    double quarters = 0.25 * 40;
    double dimes = 0.1 * 200;
    double nickels = 0.05 * 400;
    double pennies = 0.01 * 150;
    int total;
    int cent;


    total =  (int) quarters + (int) dimes + (int) nickels + (int) pennies;
    cent = 100 % total;
    System.out.println(total+" dollars and "+cent+" cents");

  }
}

Он компилируется и работает нормально. Кроме того, мне интересно, правильно ли это математически? Должен ли я получить 49 центов, что почти эквивалентно 51. (5) $? Потому что все кварталы, десять центов, никелей и копеек имеют сумму 51,5 доллара.

Ответы [ 4 ]

4 голосов
/ 24 декабря 2010

Я бы не использовал для этого тип с плавающей запятой из-за ошибок округления.

Здесь - хорошая статья, объясняющая проблему (Что должен знать каждый компьютерный специалист об арифметике с плавающей запятой).

Используйте целые числа, чтобы получить счет в центах.

Примерно так:

integer quarters = 25 * numOfQuarters;

Вы можете получить сумму в долларах, нырнув с 100.

3 голосов
/ 24 декабря 2010

Ответ Одеда определенно один для реализации. Используйте целые числа.

Однако у вас есть другая проблема: cent = 100 % total; Этот код не делает то, что вы думаете.

Поскольку сумма является целым числом и суммируется следующим образом:

total =  (int) quarters + (int) dimes + (int) nickels + (int) pennies;

Ваш результат 51. Это даже 51 доллар. Вы потеряли всю информацию о дробных долларах, преобразовав двойные значения (четверти, десять центов, никелей и пенни) в целые числа. Если бы значение кварталов было бы 10,25, тогда (int) кварталы были бы равны 10.

Теперь вы пытаетесь получить количество оставшихся центов, используя cent = 100 % total; Это дает вам целочисленный остаток от 100 / всего. В вашем случае 100/51. Остаток 49, который вы сохранили в «центах». Просто в вашем примере это произошло, чтобы быть близким к правильному значению. Вот почему ваш ответ был неправильным, а не округления.

Все, что сказано, вы все равно должны использовать целые числа для всех ваших значений.

1 голос
/ 24 декабря 2010

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

Кроме того, денежные значения кварталов, центов, никелей и копеек вряд ли изменятся в ближайшее время.Они должны быть объявлены как статические конечные переменные:

class PP28 {
 final int QUARTER = 25;
...
1 голос
/ 24 декабря 2010

Проще работать с одним представлением, например с центами, а затем перевести его в доллары. Комментарий Одеда об ошибках округления с плавающей запятой верен.

Мне кажется странным, что вы конвертируете пенни в целое число, когда значение равно 1,5, это не правильно. Нечто подобное можно сделать вместо этого:

int quarters = 25 * 40;
int dimes = 10 * 200;
int nickels = 5 * 400;
int pennies = 1 * 150;

int sum = quarters + dimes + nickels + pennies;
int dollars = sum / 100;
int cents = sum % 100;

При печати значений в долларах и центах я получаю ровно 51 доллар и 50 центов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...