我正在尝试编写一个程序,向用户返回用于输入用户输入的美元金额(美元)的最小金额美国硬币。C似乎有效0.1比较被跳过
我的问题:当程序达到0.1时,程序不会减去一角钱,而是减去镍和5便士。这只发生在大于1.85的数字上。当小于1.85时,一角钱被成功扣除。
这里是我的代码:
while (Money >= 0.25){
Money = Money - 0.25;
Coins = Coins + 1;
printf ("Current money: %f \n", Money);
}
while (Money >= 0.1) {
Money = Money - 0.1;
Coins = Coins + 1;
printf ("Current money: %f \n", Money);
}
while (Money >= 0.05) {
Money = Money - 0.05;
Coins = Coins + 1;
printf ("Current money: %f \n", Money);
}
while (Money >= 0.01) {
Money = Money - 0.01;
Coins = Coins + 1;
printf ("Current money: %f \n", Money);
}
下面是当使用数字2.1我的输出:
2.1
Current money: 1.850000
Current money: 1.600000
Current money: 1.350000
Current money: 1.100000
Current money: 0.850000
Current money: 0.600000
Current money: 0.350000
Current money: 0.100000
Current money: 0.050000
Current money: 0.040000
Current money: 0.030000
Current money: 0.020000
Current money: 0.010000
Used 13
而这个用数字1.85,当是我的输出:
1.85
Current money: 1.600000
Current money: 1.350000
Current money: 1.100000
Current money: 0.850000
Current money: 0.600000
Current money: 0.350000
Current money: 0.100000
Current money: 0.000000
Used 8
这是为什么发生?为什么硬币不能用于大于1.85的数字?
您应该阅读 - http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html不应该使用浮点数进行货币计算,而应该使用固定点(并且一些可接受的四舍五入)。 – 2012-12-28 20:35:22
@VladLazarenko喜欢它。感谢您的链接。 –