为什么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");
}
}
}
}
答案 0 :(得分:2)
你正在使用double进行计算。
请查看此http://floating-point-gui.de/
另外http://www.mkyong.com/java/how-do-calculate-monetary-values-in-java-double-vs-bigdecimal/
答案 1 :(得分:1)
我承认,我没有阅读您的代码,但我99%确定您遇到二进制数据存储问题。
你会看到,在十进制系统中,1/10可以很容易地表示为0.1。但是,尝试1/3,它变成0.33333333333333333 ......
在二进制中,1/10是0.0001100110011001100110011 ...
查看BigDecimal的base10 numberstorage。