gpt4 book ai didi

c - 当给定值并减去直到零时,C 中的无限 while 循环

转载 作者:行者123 更新时间:2023-12-01 22:21:59 25 4
gpt4 key购买 nike

我刚刚开始学习 C。我正在编写一个程序,以五角硬币、五分硬币、一角硬币和便士的形式将零钱返还给客户。由于某些原因,当 while 循环到达 0 时它不会中断。

编辑:这个问题与 SO ( Is floating point math broken? ) 上的另一个问题非常相似。我会为那些寻找有关 while 循环的答案的人保留这个问题,就像我自己一样,他们不知道 float 会导致无限 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;
}

关于如何处理有什么建议吗?

最佳答案

这是因为 float 不能 100% 正确地表示所有值。对于某些输入值,您的程序将以大于零且小于 0.1 的 val 结束。然后你就会陷入僵局。

将打印更改为:

printf("%0.30f \n", val);

将输出:

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;
}

关于c - 当给定值并减去直到零时,C 中的无限 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39387977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com