为什么我的循环早期破裂?

时间:2014-10-11 14:41:03

标签: c while-loop

我正在为课程编写一个功能,需要花费一些金钱,并告诉用户有多少硬币加起来。除了便士外,我似乎一切正常。在添加适当数量之前,我的循环有时会停止并缩短。它通常会停止1便士,但有时它会给我正确的答案(我找到的一个值给出了正确的答案是.09)。我已经尝试将浮动更改为双,我有同样的问题。我拉着我的头发试图找出我做错了什么。

void change(float total)
{
int quarters, dimes, nickels, pennies;
quarters = 0;
dimes = 0;
nickels = 0;
pennies = 0;

printf("\nTotal value entered: %.2f", total);

while (total >= .25)
{
    quarters += 1;
    total -= .25;
}
while (total >= .10)
{
    dimes += 1;
    total -= .10;
}
while (total >= .05)
{
    nickels += 1;
    total -= .05;
}
while (total >= .01)
{
    pennies += 1;
    total -= .01;
}
printf("\nQuarters: %d \nDimes: %d \nNickels: %d \nPennies: %d\n\n", quarters, dimes, nickels, pennies);

}

5 个答案:

答案 0 :(得分:6)

由于浮点数的精度有限,几乎肯定是

您可能会发现您已达到剩余价值类似于0.009999942而非0.1的点,这就是您的原因所在早退出。

但它甚至可以在你达到便士之前显示出来,如果你最终得到0.249999左边的东西,其中应该是四分之一但精确限制可能会强制到两分钱四便士。

至于解决它,我会尽快将浮点值四舍五入为整数(事先将其乘以100),然后你就不会这样做。我不得不担心浮点精度。

您可以使用以下内容执行此操作:

int itotal = total * 100 + 0.2;

然后使用itotal进行计算:

while (itotal >= 25) {
    quarters++;
    itotal -= 25;
}
// and so on ...

答案 1 :(得分:1)

我的一个实验室有一段时间也有类似的问题。而不是每个硬币面额的while循环,我有一个单独的do..while与cascaded if语句。在我的情况下,一个项目的最大成本是1美元,我选择以int为单位工作,但您可以稍后格式化最终输出。

int price, remainder, quarters, dime, nickel, pennies;

printf("Enter the price of the item you bought:>");
scanf("%d", &price);

remainder = 100 - price;

do {
    if (remainder >= 25)
    {
        quarters++;
        remainder -= 25;
    }

    else if (remainder >= 10)
    {
        dime++;
        remainder -= 10;
    }

    else if (remainder >= 5)
    {
        nickel ++;
        remainder -=5;
    }
    else if (remainder >= 1)
    {
        pennies ++;
        remainder -=1;
    }
} while (remainder > 0);

printf("\nYour change will be dispensed as:\n Quarters: %d \n Dimes: %d \n Nickel: %d  \n Pennies: %d \n\n", quarters, dime, nickel,pennies);

希望它有所帮助。

答案 2 :(得分:0)

答案 3 :(得分:0)

浮点数学非常复杂,并且受到许多常见错误预期的影响。尝试将数学转换为使用int,然后将其转换回来。

答案 4 :(得分:0)

当您比较充满错误的float时,您可以使用roundof函数并将浮点数更改为整数。

int_total = round( total * 100.0  );         //include math.h

现在,将循环更改为,

while (total >= 25)
{
    quarters += 1;
    total -= 25;
}