我正在尝试创建代码,以计算为用户提供正确零钱所需的最小硬币数量。
我写的代码几乎是正确的,但是硬币的数量总是很少。我认为这是由于小数位数增加而导致的数字不精确。
总有办法将浮点数限制为两位小数吗?
例如: 如果输入5,将得出19 * 25美分,2 * 10美分,0 * 5美分和4 * 1美分。
但是正确的数量应该分别为20-0-0-0。
#include <stdio.h>
#include <cs50.h>
//Assume that the only coins available are quarters (25¢), dimes (10¢), nickels (5¢), and pennies (1¢)
int main(){
float change;
float newTotal;
int coin25 = 0;
int coin10 = 0;
int coin5 = 0;
int coin1 = 0;
do{
change = get_float("How much change is owed: $ ");
}
while (change <= 0);
for (float i = 0.25; i < change; i += 0.25){
coin25 += 1;
}
newTotal = change - (coin25 * 0.25);
for (float j = 0.1; j < newTotal; j += 0.1){
coin10 += 1;
}
newTotal = newTotal - (coin10 * 0.1);
for (float k = 0.05; k < newTotal; k += 0.05){
coin5 += 1;
}
newTotal = newTotal - (coin5 * 0.05);
for (float l = 0.01; l < newTotal; l += 0.01){
coin1 += 1;
}
newTotal = newTotal - (coin1 * 0.01);
//int coins = coin25 + coin10 + coin5 + coin1;
//printf("%i\n", coins);
printf("%i\n", coin25);
printf("%i\n", coin10);
printf("%i\n", coin5);
printf("%i\n", coin1);
}
答案 0 :(得分:1)
这是由于浮点类型的不精确性质。您当前使用的价值可能会比您认为的价值稍高或略低。如果它恰好位于低端,您最终将获得比预期更少的硬币。
例如,值0.1实际上可以存储为0.09999999。这样一来,您最终只能得到一分钱,而不是一角钱。
将您获得的值乘以100,然后将其四舍五入为最接近的整数,然后以美分计算。假设该值小于1600万美分,那么您将获得一个准确的值。
newTotal = round(change * 100);
for (int i = 25; i < newTotal ; i += 25){
coin25 += 1;
}
newTotal = change - (coin25 * 25);
for (int j = 10; j < newTotal; j += 10){
coin10 += 1;
}
newTotal = newTotal - (coin10 * 10);
for (int k = 5; k < newTotal; k += 5){
coin5 += 1;
}
newTotal = newTotal - (coin5 * 5);
for (int l = 1; l < newTotal; l += 1){
coin1 += 1;
}
newTotal = newTotal - (coin1 * 1);
答案 1 :(得分:0)
您可以将输入乘以100来摆脱浮点问题。 (将美元输入更改为美分)
然后,您可以使用%
运算符来计算结果。