我正在为课程编写一个功能,需要花费一些金钱,并告诉用户有多少硬币加起来.除了便士之外,我似乎一切都运转得很好.在添加适当数量之前,我的循环有时会停止并缩短.它通常会停止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)
几乎可以肯定,浮点数的精度有限.
你可能会发现你已经达到了剩余价值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)
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |