Как исправить Java-программу "сортировщик денег" - PullRequest
1 голос
/ 04 октября 2019

Итак, в основном я учусь в колледже программировать на Java, у меня были первые уроки, и теперь передо мной была поставлена ​​задача создать программу «сортировщика монет» с if и whiles. Целью программы является предоставление ему суммы денег в евро, и предполагается, что она должна быть организована наиболее эффективным образом, с приоритетом более высокой стоимости счетов. Моя программа написана с некоторыми переменными на португальском языке, поэтому я объясню: (double dinheiro;) - это переменная, в которой я храню сумму денег. и затем монеты идут слева направо в списке int кода, начиная с 50 € и заканчивая 1 центом.

Программа работает отлично и делает то, что должна делать для всехобъекты «евро», которые я создаю, где деньги (dinheiro) - это значение типа int (без центов), и до тех пор, пока они не станут, например, 34,50, а это всего лишь 50 центов. Например, он не будет работать для 34,20 или 34,60 или чего-то подобного.

Когда я пытаюсь запустить что-либо с этими значениями, он не выдает никакой ошибки или чего-то подобного, простооставляет программу бесконечно запущенной без вывода (и в итоге занимает 100% процессора и перегревает компьютер).

Я очень устал и некоторое время искал ответ и пытался отладить егосам, но я просто не могу найти, что я сделал неправильно в такой, вероятно, простой вещи, поэтому я очень расстроен.

Спасибо!

public class Euros {

    private double dinheiro;
    private double n50, n20, n10, n5, m2, m1, m50c, m20c, m10c, m5c, m2c, m1c;

    public Euros(double dinheiro) {
        this.dinheiro = dinheiro;
    }

    public void distribuirDinheiro() {
        do {
            if (dinheiro >= 50) {
                dinheiro = dinheiro - 50;
                n50 = n50 + 1;
            } else if (dinheiro >= 20 && dinheiro < 50) {
                dinheiro = dinheiro - 20;
                n20 = n20 + 1;
            } else if (dinheiro >= 10 && dinheiro < 20) {
                dinheiro = dinheiro - 10;
                n10 = n10 + 1;
            } else if (dinheiro >= 5 && dinheiro < 10) {
                dinheiro = dinheiro - 5;
                n5 = n5 + 1;
            } else if (dinheiro >= 2 && dinheiro < 5) {
                dinheiro = dinheiro - 2;
                m2 = m2 + 1;
            } else if (dinheiro >= 1 && dinheiro < 2) {
                dinheiro = dinheiro - 1;
                m1 = m1 + 1;
            } else if (dinheiro >= 0.5 && dinheiro < 1) {
                dinheiro = dinheiro - 0.5;
                m50c = m50c + 1;
            } else if (dinheiro >= 0.2 && dinheiro < 0.5) {
                dinheiro = dinheiro - 0.2;
                m20c = m20c + 1;
            } else if (dinheiro >= 0.1 && dinheiro < 0.2) {
                dinheiro = dinheiro - 0.1;
                m10c = m10c + 1;
            } else if (dinheiro >= 0.05 && dinheiro < 0.1) {
                dinheiro = dinheiro - 0.05;
                m5c = m5c + 1;
            } else if (dinheiro >= 0.02 && dinheiro < 0.05) {
                dinheiro = dinheiro - 0.02;
                m2c = m2c + 1;
            } else if (dinheiro >= 0.01 && dinheiro < 0.02) {
                dinheiro = dinheiro - 0.01;
                m1c = m1c + 1;
            }
        } while (dinheiro > 0);
    }

1 Ответ

1 голос
/ 04 октября 2019

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

dinheiro = dinheiro - 0.5;

может быть сокращено до:

dinheiro -= 0.5;

Что касается вашей проблемы, как сказал @Worthless в комментарии, вы никогда не должны использовать тип данных с плавающей запятой для валютных операций, поскольку между тестом и вычислениями теряется большая точность, а также,вы не можете сделать достаточно if для каждого десятичного числа, которое может обработать double, вы должны проверить классы BigInteger или BigDecimal, о которых вы можете прочитать о здесь

...