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

Got*_*otz 1 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);

}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 6

几乎可以肯定,浮点数的精度有限.

你可能会发现你已经达到了剩余价值0.009999942而不是0.1这样的地步,这就是你早退的原因.

但它甚至可以在你达到便士之前显示出来,如果你最终得到像0.249999左边这样的东西,它应该是四分之一,但精度限制可能会强制下降到两个硬币和四个硬币.

至于解决它,我会尽可能快地将浮点值四舍五入为整数(事先将它乘以一百),然后您不必担心浮点精度.

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

int itotal = total * 100 + 0.2;
Run Code Online (Sandbox Code Playgroud)

然后itotal用于你的计算:

while (itotal >= 25) {
    quarters++;
    itotal -= 25;
}
// and so on ...
Run Code Online (Sandbox Code Playgroud)

  • 需要学习的经验:永远不要使用浮点钱. (4认同)
  • 除非你是一个高频股票交易者,并且需要一种可靠的方法来从每笔交易中略读一小部分...... (2认同)