我正在为课程编写一个功能,需要花费一些金钱,并告诉用户有多少硬币加起来。除了便士外,我似乎一切正常。在添加适当数量之前,我的循环有时会停止并缩短。它通常会停止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);
}
答案 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;
}