C 查找浮动变量的%Mod

C 查找浮动变量的%Mod,c,C,我不想找人来写我的代码,但我正在做一个家庭作业,我们应该用%来改变。到目前为止,我的代码似乎是有效的(如果我输入成本为5,投标金额为10,它会显示我的更改为5美元,并显示“$5账单:1”)。然而,当我输入一个十进制数(即:成本$5.25)时,它跳过其余的提示并输出一个随机数。我在正确的轨道上吗?或者有人能给我指点一下教程的方向吗 #include <stdio.h> int main(void) { int cost, tender,

我不想找人来写我的代码,但我正在做一个家庭作业,我们应该用%来改变。到目前为止,我的代码似乎是有效的(如果我输入成本为5,投标金额为10,它会显示我的更改为5美元,并显示“$5账单:1”)。然而,当我输入一个十进制数(即:成本$5.25)时,它跳过其余的提示并输出一个随机数。我在正确的轨道上吗?或者有人能给我指点一下教程的方向吗

 #include <stdio.h>


int main(void)
{
    int    cost,
           tender,
           change,
           twenties,
           tens,
           fives,
           ones,
           quarters,
           dimes,
           nickles,
           pennies;


    printf("Please enter cost ($): ");
    scanf("%d", &cost);

    printf("Please enter amount tendered ($): ");
    scanf("%d", &tender);

    change = tender - cost;

    printf("\nChange is $%i\n", change);

    change = ((tender - cost) * 100.0);

    twenties = change / 2000;
    printf("\n$20 bills: %i\n", twenties);

    change = change % 2000;
    tens =  change / 1000;
    printf("$10 bills: %i\n", tens);

    change = change % 1000;
    fives = change / 500;
    printf("$5 bills: %i\n", fives);

    change = change % 500;
    ones = change / 100;
    printf("$1 bills: %i\n", ones);

    change = change % 100;
    quarters = change / 25;
    printf("Quarters: %i\n", quarters);

    change = change % 25;
    dimes = change / 10;
    printf("Dimes: %i\n", dimes);

    change = change % 10;
    nickles = change / 5;
    printf("Nickles: %i\n", nickles);

    change = change % 5;
    pennies = change / 1;
    printf("Pennies: %i\n", pennies);


return (0);
}
#包括
内部主(空)
{
整数成本,
柔软的
改变
二十几岁,
经皮电刺激神经疗法,
五,
一个,,
住处,
一角硬币,
尼克,
便士;
printf(“请输入成本($):”;
scanf(“%d”和“成本”);
printf(“请输入投标金额($):”;
scanf(“%d”和“投标书”);
变更=投标-成本;
printf(“\n更改为$%i\n”,更改);
变更=((投标-成本)*100.0);
二十岁=变化/2000年;
printf(“\n$20票据:%i\n”,20);
更改=更改%2000;
十次=变化/1000;
printf(“$10票据:%i\n”,十);
更改=更改%1000;
五个=变化/500;
printf(“$5钞票:%i\n”,五张);
更改=更改%500;
1=变化/100;
printf(“$1票据:%i\n”,一张);
更改=更改%100;
季度=变动/25;
printf(“季度:%i\n”,季度);
更改=更改%25;
一角硬币=零钱/10;
printf(“一角硬币:%i\n”,一角硬币);
更改=更改%10;
刻痕=变化/5;
printf(“刻痕:%i\n”,刻痕);
更改=更改%5;
便士=零钱/1;
printf(“便士:%i\n”,便士);
返回(0);
}

float
而不是
int
声明所有变量


printf
scanf
中,使用
%f
而不是
%d
作为格式说明符。

声明为
int
的变量不能保存十进制值,小数部分被忽略。当您尝试使用
scanf()
读取
int
的小数时,小数部分仍保留在缓冲区中,并在程序中导致许多问题。要同时存储十进制值,请将其设置为双精度(或浮点)。也就是说,对于double,使用

  double   cost,
           tender,
           change,
           twenties,
           tens,
           fives,
           ones,
           quarters,
           dimes,
           nickles,
           pennies;
另外,在
scanf()
printf()
中,使用
%lf
而不是
%d

scanf("%lf", &cost);
但是,正如@Weather Vane所指出的,使用
fmod()
而不是
%
,因为
%
不能处理浮点值。这里是如何

change = fmod(change,2000);
这样,将所有
%
更改为
fmod()
。 要了解有关
fmod()
的更多信息,请访问

编辑
只需添加
float
也适用于
fmod()
。在
printf()
scanf()
中,将
%f
用于float

变量声明为
int
s
Int
只能存储整数,所以如果您输入一个十进制值,它显然不能存储在
Int

中。您尝试将浮点数放入Int类型变量中吗?怪不得它工作起来怪怪的。 尝试将输入变量声明为double或float。
另外,将
scanf(“%d”,&cost)
更改为
scanf(“%f”,&cost)
以下代码允许用户输入带小数点的数字,并以美分为单位计算整数
金额。它并不完美(可以添加更多的错误检查),但它可以处理代码的其余部分

int main( void )
{
    int dollars, cents, count, amount;
    count = scanf( "%d.%d", &dollars, &cents );

    if ( count == 1 )
        amount = dollars * 100;
    else if ( count == 2 && cents < 100 )
        amount = dollars * 100 + cents;
    else
        amount = 0;

    printf( "%d\n", amount );
}
int main(无效)
{
整数美元、美分、计数、金额;
计数=扫描频率(“%d.%d”,“美元和美分”);
如果(计数=1)
金额=美元*100;
否则如果(计数==2&¢s<100)
金额=美元*100+美分;
其他的
金额=0;
printf(“%d\n”,金额);
}

使用
float
是个坏主意,因为会出现舍入错误。正如本例所示,您经常会少给客户一分钱。解决这个问题的方法有很多,但用整数计算更简单、更精确

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

#define DENOMINATIONS 8
char *names[DENOMINATIONS] = {"twenties","tens","fives","ones",
                              "quarters","dimes","nickels","pennies"};
float values[DENOMINATIONS]= {20.0f, 10.0f, 5.0f, 1.0f, 
                              0.25f, 0.10f, 0.05f, 0.01f };

int main(int argc, char** args) {
    int k;
    float change = 1.01f, number;
    printf ("Make %.2f change:\n", change);
    for (k=0; k<DENOMINATIONS; k++) {
        number = change / values[k];
        printf ("%-10s %10f %5d\n", names[k], number, (int)number);
        change = fmodf (change, values[k]);
    }
    return 0;
}

阅读有关各种数字格式的输入和存储的文档您输入的成本为5.25,并将其作为
%d
扫描为
int
成本
。过去的所有内容(包括小数点)都不会被读取,因为它不是有效的
int
的一部分。此外,当您请求读取
提交的
时,由于前导的
仍然卡在输入缓冲区中,因此读取完全失败。因此,代码逻辑的其余部分使用了不确定的伪
成本
投标
。如果您检查输入成功/失败状态,所有这些都可以检测到。假设是一切之母…您必须使用带%f的浮点表示小数。请在每个
printf
格式字符串的末尾添加
\n
。然后,使用所有警告和调试信息进行编译(
gcc-Wall-Wextra-g
)。并使用调试器(
gdb
)@user1627167 float不能与%No一起工作,因为mod操作符
%
不能在float上工作。使用
fmod()
Yikes。。。。我没注意到那部分。谢谢你通知我@Weather Vane。但是我可以请你帮忙吗?请帮助我,因为我不知道如何使用
fmod()
@WeatherVane,这正是我遇到的问题!%不适用于浮动。我也尝试过只浮动成本和投标,但随后变化作为一个整体显示出来。(即:4美元,但它仍然会注明1:4,25:3)我会试试fmod()谢谢@Arun这花了我几秒钟的时间才找到:你会看到有一个
double
和一个
float
版本
Make 1.01 change:
twenties     0.050500     0
tens         0.101000     0
fives        0.202000     0
ones         1.010000     1
quarters     0.040000     0
dimes        0.100000     0
nickels      0.200000     0
pennies      0.999999     0