gpt4 book ai didi

c - 为什么这种更改计数算法的行为不可靠?

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:28 24 4
gpt4 key购买 nike

我对编程有些陌生,在大学只学过一门 Python 类(class),现在正在学习哈佛的 CS50 OpenCourseware,所以请多多包涵。

此代码编译正常,没有错误等。该程序旨在获取用户输入的找零金额,并使用简单的贪心算法返回表示该找零所需的每个美国硬币的最少数量。足够简单;然而,这里让我感到困惑的是,出于某种原因,它并不总是计算硬币。

如果我输入“.41”,我将得到“1 25 美分、1 角硬币、1 镍币和 0 便士”;进入“.42”产生“1 夸特、1 角钱、1 镍币和 1 便士”;但奇怪的是,“.43”会生成正确的“1 25 美分、1 角硬币、1 镍币和 3 便士”。

正是这个错误的前后矛盾让我很难找到它。我不断地使用不同的输入在脑海中浏览代码,试图找出问题所在,但这是徒劳的。

我做错了什么?

#include <stdio.h>
#include <cs50.h>

int main(void)
{
printf("How much change is owed? ");
float change = GetFloat();
int quarters = 0;
int dimes = 0;
int nickels = 0;
int pennies = 0;

float coinArray[4] = {.25, .10, .05, .01};
int coinNames[4] = {quarters, dimes, nickels, pennies};

int counter(float coinArray);
{
int x;
for(x = 0; x < 4; x++)
{
while (change >= coinArray[x])
{
change = change - coinArray[x];
coinNames[x]++;
}
}

}
printf("%d Quarters, %d Dimes, %d Nickels, and %d Pennies\n",
coinNames[0], coinNames[1], coinNames[2], coinNames[3]);
}

最佳答案

这是一个简单的事实,您的计算机根本无法准确表示 0.2。从数学上讲,它只是 1/5,但您的计算机无法将其表示为 float,就像您无法将 1/3 表示为十进制数一样。 0.41 只是 41/100,这是一个最小分数,分母中有两个因数 5 - 没有机会表示为 float

准确处理货币的唯一方法是以美分而不是美元计算。这样您就可以使用整数(int 或更好的 long long 而不是 float),并且永远不会出现舍入错误。

关于c - 为什么这种更改计数算法的行为不可靠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25492439/

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