-1 ошибка расчета в Java

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

Проблема:

С учетом суммы покупки и суммы, указанной в качестве платежа, рассчитайте количество и тип каждого номинала валюты, возвращаемой в качестве изменения. Изменение всегда дается с большинством самых высоких деноминаций в первую очередь. Используемые номиналы бумажных денег будут составлять 100, 50, 20, 10, 5 и 1 долл. США. Номинал монет составит 0,25 доллара, 0,10 доллара, 0,05 доллара и 0,01 доллара.

INPUT: будет 5 строк ввода. Каждая строка будет содержать 2 рациональных числа, представляющих сумму покупки и сумму, указанную в качестве оплаты.

ВЫХОД: Для каждой входной строки выведите изменение, используя количество ненулевых номиналов, используемых в порядке их величины от высокого до низкого. Если не требуется никаких изменений, выведите NONE. Пример выходных данных № 1 представляет собой: 1-5, 2-1, 1-25, 2-10, 10,01, 01.

ОБРАЗЕЦ ВХОДА ОБРАЗЕЦ ВЫХОДА
1. 12.53, 20.00 1. 121221
2. 11,33, 15,00 2. 32112
3. 35.64, 50.00 3. 14111
4. 72.67, 100.00 4. 112113
5. 106.68, 200.00 5. 123112

Я решил создать две программы: длинную, простую для подписки и сжатую версию.

Вот длинный:

    import java.util.*;

    public class Prac13CorrectChange {

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);

    for (int A = 1; A <= 5; A++) {

        System.out
                .println("What is the amount of your purchase and the amount given as your payment?");
        String input = in.nextLine();

        String[] data = input.split(",");
        double $amount = Double.parseDouble(data[0]);
        double price = Double.parseDouble(data[1]);

        double change = price - $amount;

        int ans1 = ((int) (change / 100));
        change = change - (ans1 * 100);

        int ans2 = ((int) (change / 50));
        change = change - (ans2 * 50);

        int ans3 = ((int) (change / 20));
        change = change - (ans3 * 20);

        int ans4 = ((int) (change / 10));
        change = change - (ans4 * 10);

        int ans5 = ((int) (change / 5));
        change = change - (ans5 * 5);

        int ans6 = ((int) (change / 1));
        change = change - (ans6 * 1);

        int ans7 = ((int) (change / .25));
        change = change - (ans7 * .25);

        int ans8 = ((int) (change / .10));
        change = change - (ans8 * .10);

        int ans9 = ((int) (change / .05));
        change = change - (ans9 * .05);

        int ans10 = ((int) (change / .01));
        change = change - (ans10 * .01);

        String answer = "";

        if (ans1 != 0) {

            answer = answer + Integer.toString(ans1);

        }

        if (ans2 != 0) {

            answer = answer + Integer.toString(ans2);

        }

        if (ans3 != 0) {

            answer = answer + Integer.toString(ans3);

        }

        if (ans4 != 0) {

            answer = answer + Integer.toString(ans4);

        }

        if (ans5 != 0) {

            answer = answer + Integer.toString(ans5);

        }

        if (ans6 != 0) {

            answer = answer + Integer.toString(ans6);

        }

        if (ans7 != 0) {

            answer = answer + Integer.toString(ans7);

        }

        if (ans8 != 0) {

            answer = answer + Integer.toString(ans8);

        }

        if (ans9 != 0) {

            answer = answer + Integer.toString(ans9);

        }

        if (ans10 != 0) {

            answer = answer + Integer.toString(ans10);

        }

        System.out.println(answer);

    }
}

}

А вот сокращенная версия.

    import java.util.Scanner;

    public class Prac15CorrectChangeShort {

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);

    for (int A = 1; A <= 5; A++) {

        System.out
                .println("What is the amount of your purchase and the amount given as your payment?");
        String input = in.nextLine();

        String[] data = input.split(",");
        double $amount = Double.parseDouble(data[0]);
        double price = Double.parseDouble(data[1]);

        double change = price - $amount;
        int ans[] = new int[10];
        double money[] = { 100, 50, 20, 10, 5, 1, 0.25, 0.10, 0.05, 0.01 };

        for (int looptimes = 0; looptimes < 10; looptimes++) {

            ans[looptimes] = ((int) (change / money[looptimes]));
            change = change - (ans[looptimes] * money[looptimes]);

        }

        for (int looptimes = 0; looptimes < 10; looptimes++) {
            if (ans[looptimes] != 0) {
                System.out.print(ans[looptimes]);
            }
        }
        System.out.print('\n');
    }

}

}

Основная проблема, с которой я сталкиваюсь, заключается в том, что, независимо от того, какую отладку я делаю, она дает мне неверные результаты #2-5. Это дает мне на 1 меньше за последнюю цифру. Ни программист, который дал мне эту проблему, ни я не могу найти причину этого возникновения.

Пожалуйста помоги.

1 ответ

Похоже, ошибка с плавающей запятой.

Прочитай это

Вы можете использовать BigDecimal вместо double при расчете изменения.

 BigDecimal change = BigDecimal.valueOf(price - $amount);
Другие вопросы по тегам