0

I am writing a small program to give me the max amount of each coin category (quarters, dimes, etc) when I enter an amount. The modulus operator is not returning a correct value. For example, when I enter the amount "1.64", it should return: Quarters: 6, Dimes: 1, Nickels: 0, Pennies: 4. But my problem is at pennies. It keeps returning 3 pennies only. Any input would be appreciated!

import java.util.Scanner;

public class Main{
    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter amount: ");
        double amount = in.nextDouble();

        int quarters = (int)(amount / 0.25);
        System.out.println("Quarters: " + quarters);

        amount = (amount % 0.25);

        int dimes = (int)(amount / 0.1);
        System.out.println("Dimes: " + dimes);

        amount = (amount % 0.1);

        int nickels = (int)(amount / 0.05);
        System.out.println("Nickels: " + nickels);

        amount = (amount % 0.05);

        int pennies = (int)(amount / 0.01);
        System.out.println("Pennies: " + pennies);
    }
}

Enter amount: 1.64 Quarters: 6 Dimes: 1 Nickels: 0 Pennies: 3

A7XXY
  • 1
  • 1
  • you declared the amount in double data type `amount = (amount % 0.05);` this results `0.0399999999999999` and when you do a division for that it results in 3 – Dinesh K Sep 11 '19 at 06:25

3 Answers3

0

Instead of resetting amount by modulus after each step, I suggest you use basic subtraction. Then simple multiplication of the remaining total at the end will give you pennies. For example,

int quarters = (int) (amount / 0.25);
System.out.println("Quarters: " + quarters);

amount -= (quarters * 0.25); // (remove quarters)

int dimes = (int) (amount / 0.1);
System.out.println("Dimes: " + dimes);

amount -= (dimes * 0.1); // (remove dimes)

int nickels = (int) (amount / 0.05);
System.out.println("Nickels: " + nickels);

amount -= (nickels * 0.05); // remove nickels, all that's left is pennies (in cents)
System.out.println("Pennies: " + Math.round(100 * amount));
Elliott Frisch
  • 198,278
  • 20
  • 158
  • 249
0

It might be due to rounding differences. If you'd rebase the amount so that it's non fractional ( i.e. amount *= 100 ) and redo the calculus with integers instead you'll get the right answer

 public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter amount: ");
        double amount = in.nextDouble();

        amount = amount * 100;

        int quarters = (int)(amount / 25);
        System.out.println("Quarters: " + quarters);

        amount = (amount % 25);

        int dimes = (int)(amount / 10);
        System.out.println("Dimes: " + dimes);

        amount = (amount % 10);

        int nickels = (int)(amount / 5);
        System.out.println("Nickels: " + nickels);

        amount = (amount % 5);

        int pennies = (int)amount;
        System.out.println("Pennies: " + pennies);
    }
0

This is due to the loss of significance associated with floating-point arithmetic. See this article on why using floating-point arithmetic is bad in monetary calculations.

So the easiest thing to do is first multiply the input value by 100 and make it a whole number. Then alter your fractions to cater that multiplication.

    Scanner in = new Scanner(System.in);
    System.out.println("Enter amount: ");
    double amountO = in.nextDouble();
    int amount = (int) (amountO * 100);
    System.out.println(amount);


    int quarters = amount / 25;
    System.out.println("Quarters: " + quarters);

    amount = (amount % 25);
    System.out.println(amount);

    int dimes = amount / 10;
    System.out.println("Dimes: " + dimes);

    amount = (amount % 10);
    System.out.println(amount);

    int nickels = amount / 5;
    System.out.println("Nickels: " + nickels);

    amount = (amount % 5);
    System.out.println(amount);

    int pennies = amount;
    System.out.println("Pennies: " + pennies);
Udith Gunaratna
  • 2,091
  • 1
  • 13
  • 17