C 除法给出错误的解释

C 除法给出错误的解释,c,division,truncate,C,Division,Truncate,这是一个简单的问题,在给定一个N值的情况下,计算给出变化所需的最小硬币数。0.04/0.01的除法是3,为什么 #include <stdio.h> #include <stdlib.h> #include <math.h> int MinQtdCoins(float N, float coins[], int qtdCoins) { int i, qtdMinCoins = 0; int numCoins=0; for(i=0; i

这是一个简单的问题,在给定一个N值的情况下,计算给出变化所需的最小硬币数。0.04/0.01的除法是3,为什么

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int MinQtdCoins(float N, float coins[], int qtdCoins)
{
    int i, qtdMinCoins = 0;
    int numCoins=0;
    for(i=0; i<qtdCoins; i++)
    {
        if(N > coins[i] || fabs(N - coins[i]) < 0.0000000001)  // N >= coins[i]
        {
            numCoins = (int)(N/coins[i]);
            printf("Number of Coins: %f divided by %f = %d, ",N,coins[i],numCoins);
            qtdMinCoins += numCoins;
            N = N - numCoins*coins[i];
            printf("remains: %f\n",N);

        }
    }
    return qtdMinCoins;
}

int main()
{
    int qtdCoins = 5;
    float coins[] = {0.50, 0.25, 0.10, 0.05, 0.01};
    float N=9.79;

    printf("\n\n%d\n",MinQtdCoins(N, coins, qtdCoins));
    return 0;
}
numCoins = (int)(N/coins[i]);
#包括
#包括
#包括
int-MinQtdCoins(浮点数N,浮点数[],int-qtdCoins)
{
int i,qtdMinCoins=0;
int numCoins=0;
对于(i=0;i硬币[i]| |晶圆厂(N-硬币[i])<0.0000000001)//N>=硬币[i]
{
货币=(整数)(N/硬币[i]);
printf(“硬币数量:%f除以%f=%d,”,N,硬币[i],numCoins);
qtdMinCoins+=numCoins;
N=N-货币*硬币[i];
printf(“剩余:%f\n”,n);
}
}
返回qtdMinCoins;
}
int main()
{
int-qtdCoins=5;
浮动硬币[]={0.50,0.25,0.10,0.05,0.01};
浮点数N=9.79;
printf(“\n\n%d\n”,MinQtdCoins(n,coins,qtdCoins));
返回0;
}
0.04/0.01的除法是3,为什么

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int MinQtdCoins(float N, float coins[], int qtdCoins)
{
    int i, qtdMinCoins = 0;
    int numCoins=0;
    for(i=0; i<qtdCoins; i++)
    {
        if(N > coins[i] || fabs(N - coins[i]) < 0.0000000001)  // N >= coins[i]
        {
            numCoins = (int)(N/coins[i]);
            printf("Number of Coins: %f divided by %f = %d, ",N,coins[i],numCoins);
            qtdMinCoins += numCoins;
            N = N - numCoins*coins[i];
            printf("remains: %f\n",N);

        }
    }
    return qtdMinCoins;
}

int main()
{
    int qtdCoins = 5;
    float coins[] = {0.50, 0.25, 0.10, 0.05, 0.01};
    float N=9.79;

    printf("\n\n%d\n",MinQtdCoins(N, coins, qtdCoins));
    return 0;
}
numCoins = (int)(N/coins[i]);
转换为
int
只会截断小数部分。因此,如果
0.04/0.01==3.999..
(由于四舍五入),结果是
3

0.04/0.01的除法是3,为什么

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int MinQtdCoins(float N, float coins[], int qtdCoins)
{
    int i, qtdMinCoins = 0;
    int numCoins=0;
    for(i=0; i<qtdCoins; i++)
    {
        if(N > coins[i] || fabs(N - coins[i]) < 0.0000000001)  // N >= coins[i]
        {
            numCoins = (int)(N/coins[i]);
            printf("Number of Coins: %f divided by %f = %d, ",N,coins[i],numCoins);
            qtdMinCoins += numCoins;
            N = N - numCoins*coins[i];
            printf("remains: %f\n",N);

        }
    }
    return qtdMinCoins;
}

int main()
{
    int qtdCoins = 5;
    float coins[] = {0.50, 0.25, 0.10, 0.05, 0.01};
    float N=9.79;

    printf("\n\n%d\n",MinQtdCoins(N, coins, qtdCoins));
    return 0;
}
numCoins = (int)(N/coins[i]);

转换为
int
只会截断小数部分。因此,如果
0.04/0.01==3.999..
(由于四舍五入),结果是
3

您正在进行浮点除法,并将值保留在整数中…因为此值被截断为3

您正在进行浮点除法,并将值保留在整数中…因为此值被截断为3

,我猜您正在执行的浮点除法给出接近但小于4的答案,并将其截断为整数得到3。试着将你的目标值和硬币的值乘以100,这样整个计算就可以用整数相关(如果不是重复的话)来完成:我猜你正在执行一个浮点除法,给出的结果接近但小于4,然后将其截断为整数,得到3。试着将你的目标和硬币的值乘以100,这样整个计算就可以用整数来完成,如果不是重复的话:不要用整数?@MartinJames:不,不要用浮点来表示货币。使用整数分。如果要舍入到最接近的
int
,可以尝试
(N/coins[i]+0.5)
。(假设
N
coins[i]
为正。)[这只是对“如何取整”问题的回答,我没有检查算法的逻辑。关于算法本身,请参阅@R的建议。]“使用整数分”是什么意思?把所有东西都表示成整数,甚至是N(要除以的总值)?@RoniCastro:是的。你所有的数字都是精确的分整数。另一方面,0.01和0.04不是浮点值。编译器翻译程序时,会将其转换为最接近的可表示浮点值。仅供参考,在金融业中,浮点的使用通常是被禁止的,大概是因为看似无辜的浮点错误可以用来盗用巨额资金(在处理他们正在处理的数字规模时)。不要使用整数?@MartinJames:不,不要用浮点来表示金钱。使用整数分。如果要舍入到最接近的
int
,可以尝试
(N/coins[i]+0.5)
。(假设
N
coins[i]
为正。)[这只是对“如何取整”问题的回答,我没有检查算法的逻辑。关于算法本身,请参阅@R的建议。]“使用整数分”是什么意思?把所有东西都表示成整数,甚至是N(要除以的总值)?@RoniCastro:是的。你所有的数字都是精确的分整数。另一方面,0.01和0.04不是浮点值。编译器翻译程序时,会将其转换为最接近的可表示浮点值。仅供参考,在金融业中,浮点的使用通常是被禁止的,大概是因为看似无辜的浮点错误可以被用来盗用巨额资金(在处理他们正在处理的数字规模时)。