Изменить калькулятор с помощью Java - PullRequest
1 голос
/ 09 апреля 2019

Мне нужно создать программу, которая будет рассчитывать изменения наиболее эффективным способом. Ex. 3 четверти вместо 75 копеек. Это всего лишь однодолларовые купюры, кварталы, десять центов и т. Д. Однако есть несколько правил, которым я должен следовать.

1) Разделите компоненты в долларах и центах исходной строки ввода в отдельные подстроки.

2) Используйте служебный класс Integer для анализа этих двух подстрок в примитивные целочисленные значения.

3) Вы не можете использовать никакие типы в своей работе.

4) Тщательно протестируйте, чтобы избежать ошибок округления.

Код - это то, что я делал изначально, но я всегда получаю пенни за некоторые значения

public class ChangeCalculator
{
public static void Main (String args[]){
    double NumberOfMoney = Double.parseDouble(args [0]);
    int NumberOfCoins = (int)(NumberOfMoney * 100);

    System.out.println("Amount of Money: " + NumberOfMoney + "\n");

    int NumberOfDollars = (int)(NumberOfCoins/100);
    NumberOfCoins = NumberOfCoins - 100 * NumberOfDollars;
    System.out.println("Dollars: " + NumberOfDollars);

    int NumberOfQuarters = (int)(NumberOfCoins/25);
    NumberOfCoins = NumberOfCoins - 25 * NumberOfQuarters;
    System.out.println("Quarters: " + NumberOfQuarters);

    int NumberOfDimes = (int)(NumberOfCoins/10);
    NumberOfCoins = NumberOfCoins - 10 * NumberOfDimes;
    System.out.println("Dimes: " + NumberOfDimes);

    int NumberOfNickels = (int)(NumberOfCoins/5);
    NumberOfCoins = NumberOfCoins - 5 * NumberOfNickels;
    System.out.println("Nickels: " + NumberOfNickels);

    int NumberOfPennies = (int)(NumberOfCoins/1);
    NumberOfCoins = NumberOfCoins - 1 * NumberOfPennies;
    System.out.println("Pennies: " + NumberOfPennies);
}
}

вход $ 1.15 должен выводить Долларов: 1 Кварталы: 0 10 центов: 1 Никелей: 1 Копеек: 0 НО это выводит Долларов: 1 Кварталы: 0 10 центов: 1 Никелей: 0 Копейки: 4

Ответы [ 4 ]

2 голосов
/ 09 апреля 2019

Проблема в том, что двойное не так точно, как некоторые люди, возможно, заставили вас поверить.В вашем коде проблема основана на

int NumberOfCoins = (int)NumberOfMoney * 100;

, поскольку вывод этой операции - 114.999999999 ... Здесь есть 2 варианта, вы можете либо округлить операцию, используя Math.roundили используйте другой тип, который является более точным, но медленнее, например, BigDecimal.

. Вы можете использовать BigDecimal, если вам нужна такая точность, но базовые операторы, такие как +,-,/*, не существуют в BigDecimal, но вы можете использовать их методы * 1011.* и т. д.

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

NumberOfMoney должно быть numberOfMoney
NumberOfCoins должно быть numberOfCoins Имена можно улучшить, но на данный момент это нормально.

Если вы разделитеint другим int конечное значение всегда будет int, нет необходимости его разыгрывать.
например,

//The following statements are equal
int NumberOfDollars = (int)(NumberOfCoins/100);
int NumberOfDollars = NumberOfCoins / 100;

Эта операция слишком сложна, и вы можете просто еще больше

//from
int NumberOfDollars = NumberOfCoins / 100;
NumberOfCoins = NumberOfCoins - 100 * NumberOfDollars;

//to
int NumberOfDollars = NumberOfCoins / 100;
NumberOfCoins = NumberOfCoins % 100;

Обновление 2:
Из правил, которые вы опубликовали, вы не следуете правилам 1,2 и 3. Для правила 1 он просит вас изолировать2 компонента строки.Первый компонент - это значения в долларах, а второй - значения в центах.

String amountValue = "1.15";
String dollaralue = "1" // you need to figure out how to do this.
String centValue = "15" // same

Для правила 2 проверьте документацию на Integer и, в частности, на parseInt.

Для правила 3 ​​это приведение типов int NumberOfCoins = (int)(NumberOfMoney * 100);.

2 голосов
/ 09 апреля 2019

Попробуйте это как свою вторую строку в Main:

int NumberOfCoins = (int)Math.round(NumberOfMoney * 100);

Причина в том, что NumberOfMoney * 100 это 114.999999999, и поэтому (int)(NumberOfMoney * 100) это 114.В общем, вы должны быть осторожны, чтобы не доверять точным значениям double и float переменных.

1 голос
/ 09 апреля 2019

Ошибки, которые вы видите, связаны с тем, что вы не следуете инструкции 3, чтобы избежать приведения типов.

В нескольких местах вы делаете что-то вроде:

int NumberOfCoins = (int)(NumberOfMoney * 100);

Это приведение, и приведение между int и double может вызвать ошибки округления, которые вы видите. Вы можете обойти это, округлив определенным образом.

Тем не менее, я думаю, что вы преуспели бы, следуя первой вашей инструкции:

1) Isolate both the dollars and cents components of the original input string into separate sub strings.

Тогда вы будете иметь дело с целыми числами и сможете более аккуратно выполнять свои вычисления.

1 голос
/ 09 апреля 2019

измени свой int NumberOfCoins = (int)(NumberOfMoney * 100); до int NumberOfCoins = (int)(Math.round(NumberOfMoney * 100));

Поскольку другие равноправные лица упоминают о двойном значении, и с плавающей точкой нельзя реально доверять при работе с валютами, стоит прочитать Почему бы не использовать Double или Float для представления валюты?

...