为什么java将整数转化为更少的东西

时间:2014-01-26 03:48:04

标签: java swing integer

为什么java会将一个本来是10的数字变成像9.999999999999998这样的东西? 这是我的代码。此外,任何关于良好做法的建议都将受到赞赏。例如,我可以做什么代替所有if语句。我的代码的目的是接受输入成本和支付的金额。输出将是差异以及必须返回的结果美元和硬币。这是我遇到困难的代码。

package another;

import javax.swing.JOptionPane;

/**
 *
 * @author Will
 */
public class Another {

    public static void tryAgain() {
        JOptionPane.showMessageDialog(null, "Enter a valid amount and try again");
        System.exit(0);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        String purchase = JOptionPane.showInputDialog("Please enter a the purchase amount");

        if (purchase == null) {
            System.exit(0);
        }

        if (purchase.isEmpty()) {
            tryAgain();
        }

        for (int i = 0; i < purchase.length(); i = i + 1) {
            if (!Character.isDigit(purchase.charAt(i))
                    && !purchase.contains(".")) {
                tryAgain();
            }
        }

        String given = JOptionPane.showInputDialog("Please enter the given amount");

        if (given == null) {
            System.exit(0);
        }

        if (given.isEmpty()) {
            tryAgain();
        }

        for (int i = 0; i < given.length(); i = i + 1) {
            if (!Character.isDigit(given.charAt(i))
                    && !given.contains(".")) {
                tryAgain();
            }
        }

        Double a = Double.parseDouble(purchase);
        Double b = Double.parseDouble(given);
        Double c = b - a;

        if (c < 0) {
            JOptionPane.showMessageDialog(null, "Give the cashier more money!");
            System.exit(0);
        }

        System.out.println( "Change: $" + c);

        if (c > 100) {
            double hundredsPlusExtra = c / 100;
            double hundredsWithout = Math.floor(hundredsPlusExtra); //this line rounds down
            c = c - hundredsWithout * 100;
            if (hundredsWithout == 1) {
                System.out.println(hundredsWithout + " One-Hundred Dollar Bill");
            } else {
                System.out.println(hundredsWithout + " Hundred Dollar Bills");
            }
        }

        if (c > 50) {
            double fiftiesPlusExtra = c / 50;
            double fiftiesWithout = Math.floor(fiftiesPlusExtra); //this line rounds down
            c = c - fiftiesWithout * 50;
            if (fiftiesWithout == 1) {
                System.out.println(fiftiesWithout + " Fifty Dollar Bill");
            } else {
                System.out.println(fiftiesWithout + " Fifty Dollar Bills");
            }
        }

        if (c > 20) {
            double twentiesPlusExtra = c / 20;
            double twentiesWithout = Math.floor(twentiesPlusExtra); //this line rounds down
            c = c - twentiesWithout * 20;
            if (twentiesWithout == 1) {
                System.out.println(twentiesWithout + " Twenty Dollar Bill");
            } else {
                System.out.println(twentiesWithout + " Twenty Dollar Bills");
            }
        }

        if (c > 10) {
            double tensPlusExtra = c / 10;
            double tensWithout = Math.floor(tensPlusExtra); //this line rounds down
            c = c - tensWithout * 10;
            if (tensWithout == 1) {
                System.out.println(tensWithout + " Ten Dollar Bill");
            } else {
                System.out.println(tensWithout + " Ten Dollar Bills");
            }

        }

        if (c > 5) {
            double fivesPlusExtra = c / 5;
            double fivesWithout = Math.floor(fivesPlusExtra); //this line rounds down
            c = c - fivesWithout * 5;
            if (fivesWithout == 1) {
                System.out.println(fivesWithout + " Five Dollar Bill");
            } else {
                System.out.println(fivesWithout + " Five Dollar Bills");
            }

        }

        if (c > 1) {
            double onesPlusExtra = c / 1;
            double onesWithout = Math.floor(onesPlusExtra); //this line rounds down
            c = c - onesWithout * 1;
            if (onesWithout == 1) {
                System.out.println(onesWithout + " One Dollar Bill");
            } else {
                System.out.println(onesWithout + " One Dollar Bills");
            }
        }

        if (c > .25) {
            double quartersPlusExtra = c / .25;
            double quartersWithout = Math.floor(quartersPlusExtra); //this line rounds down
            c = c - quartersWithout * .25;
            if (quartersWithout == 1) {
                System.out.println(quartersWithout + " Quarter");
            } else {
                System.out.println(quartersWithout + " Quarters");
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

我承认,我没有阅读您的代码,但我99%确定您遇到二进制数据存储问题。

你会看到,在十进制系统中,1/10可以很容易地表示为0.1。但是,尝试1/3,它变成0.33333333333333333 ......

在二进制中,1/10是0.0001100110011001100110011 ...

查看BigDecimal的base10 numberstorage。