You are here: Home » Учебник » Учебное задание: подсчёт денежных единиц

Учебное задание: подсчёт денежных единиц

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

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

Вот шаги по разработке программы:

  1. Попросите пользователя ввести сумму в виде десятичного числа, например, 11.56.
  2. Преобразуйте количество (например, 11.56) в центы (1156).
  3. Разделите центы на 100, чтобы найти количество долларов. Получите оставшиеся центы, используя целый остаток от деления на 100 центов.
  4. Разделите оставшиеся центы на 25, чтобы найти количество четвертаков. Получите оставшиеся центы, используя остаток целочисленного деления на 25.
  5. Разделите оставшиеся центы на 10, чтобы найти количество десятицентовиков. Получите оставшиеся центы, используя остаток от деления на 10.
  6. Разделите оставшиеся центы на 5, чтобы найти количество пятаков. Получите оставшиеся центы, используя оставшиеся от целочисленного деления на 5 центы.
  7. Остальные центы - это пенни.
  8. Отобразите результат.

Полная программа:

import java.util.Scanner;

public class ComputeChange {
    public static void main(String[] args) {
        // Создайте Scanner
        Scanner input = new Scanner(System.in);

        // Получите количество
        System.out.print(
                "Введите количество в виде числа с плавающей запятой, например 11,56: ");
        double amount = input.nextDouble();

        int remainingAmount = (int) (amount * 100);

        // Находим количество долларов
        int numberOfOneDollars = remainingAmount / 100;
        remainingAmount = remainingAmount % 100;

        // Находим количество четвертаков и оставшуюся величину
        int numberOfQuarters = remainingAmount / 25;
        remainingAmount = remainingAmount % 25;

        // Находим количество десячков и оставшуюся величину
        int numberOfDimes = remainingAmount / 10;
        remainingAmount = remainingAmount % 10;

        // Находим количество пятаков и оставшуюся величину
        int numberOfNickels = remainingAmount / 5;
        remainingAmount = remainingAmount % 5;

        // Находим количество пенни и оставшуюся величину
        int numberOfPennies = remainingAmount;

        // Display results
        System.out.println("Ваши деньги " + amount + " состоят из");
        System.out.println(" " + numberOfOneDollars + " долларов");
        System.out.println(" " + numberOfQuarters + " четвертаков ");
        System.out.println(" " + numberOfDimes + " десячков");
        System.out.println(" " + numberOfNickels + " пятаков");
        System.out.println(" " + numberOfPennies + " пенни");
    }
}

Переменная amount хранит сумму, введенную с консоли (строка 11). Эта переменная не изменяется, так как сумма должна быть использована в конце программы для отображения результатов. Программа вводит переменную remainingAmount (строка 13) для сохранения изменения оставшейся суммы.

Переменная amount представляет собой десятичную цифру double, представляющую доллары и центы. Она преобразуется в int переменную remainingAmount, которая представляет все центы. Например, если amount равна 11,56, то первоначальная remainingAmount равна 1156. Оператор деления дает целочисленную часть деления, поэтому 1156/100 равно 11. Оператор остатка от деления получает остаток от деления, поэтому 1156 % 100 составляет 56.

Программа извлекает максимальное количество долларов из оставшейся суммы и получает новую оставшуюся сумму в переменной remainingAmount (строки 16-17). Затем она извлекает максимальное количество четвертаков из remainingAmount и получает новый remainingAmount (строки 20-21). Продолжая тот же процесс, программа находит максимальное количество десячков, пятаков и пенни в оставшейся сумме.

Одной из серьезных проблем с этим примером является возможная потеря точности при преобразовании double amount в int remainingAmount. Это может привести к неточному результату. Если вы попытаетесь ввести сумму 10.03, 10.03 * 100 станет 1002.9999999999999. Вы обнаружите, что программа отображает 10 долларов и 2 пенни. Чтобы устранить проблему, введите сумму как целое значение, представляющее центы (смотрите упражнение 22).

Проверь себя:

  1. Покажите вывод с введённой суммой 1,99.

2 комментария

  1. Возможно, тупой вопрос, но почему 10.03*100= 1002.9999999999999?

    • Приветствую! Ваш вопрос настолько интересный, что я ответил на него отдельным сообщением в блоге: https://java9.ru/?p=524

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

wp-puzzle.com logo