我刚刚开始学习C.我正在编写一个程序,以季度,镍币,硬币和便士的形式给客户带来变化.出于某种原因,当while循环达到0时,它不会中断.
编辑:这个问题非常类似于已经在SO上的另一个问题(浮动点数学是否被打破?).我会为那些寻找有关while循环的答案的人保留这个问题,就像我自己一样,他不知道浮点数是否会导致无限循环.
#include <stdio.h>
#include <cs50.h>
int main(void){
float val;
int quarters = 0;
int dimes = 0;
int nickels = 0;
int pennies = 0;
printf("How much change is due?: \n");
val = GetFloat();
while (val > 0){
if (val >= 0.25){
quarters += 1;
val -= 0.25;
}
else if (val >= 0.1) {
dimes += 1;
val -= 0.1;
}
else if (val >= 0.05){
nickels += 1;
val -= 0.05;
}
else if (val >= 0.01){
pennies += 1;
val -= 0.01;
}
printf("%f \n", val);
}
printf("Quarters: %i\n", quarters);
printf("Dimes: %i\n", dimes);
printf("Nickels: %i\n", nickels);
printf("Pennies: %i\n", pennies);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有关如何处理的任何建议?
这是因为float无法正确表示所有值100%.对于某些输入值,程序最终val会大于零且小于0.1.然后你就陷入了僵局.
将您的打印更改为:
printf("%0.30f \n", val);
Run Code Online (Sandbox Code Playgroud)
将输出:
0.009999995119869709014892578125
在我的系统上.
更好的方法可能是进行计算int.就像是:
#include <stdio.h>
#include <cs50.h>
#include <math.h>
int main(void){
float val;
int intval;
int quarters = 0;
int dimes = 0;
int nickels = 0;
int pennies = 0;
printf("How much change is due?: \n");
val = GetFloat();
intval = roundf(100 * val); // Multiply by 100 and convert to int
// Use intval instead of val for the remaining code
while (intval > 0){
if (intval >= 25){ // note: 0.25 --> 100 * 0.25 --> 25
quarters += 1; // similar for all other code below
intval -= 25;
}
else if (intval >= 10) {
dimes += 1;
intval -= 10;
}
else if (intval >= 5){
nickels += 1;
intval -= 5;
}
else if (intval >= 1){
pennies += 1;
intval -= 1;
}
printf("%d \n", intval );
}
printf("Quarters: %i\n", quarters);
printf("Dimes: %i\n", dimes);
printf("Nickels: %i\n", nickels);
printf("Pennies: %i\n", pennies);
return 0;
}
Run Code Online (Sandbox Code Playgroud)