C语言 确定浮点数是否有小数部分?

wqnecbli  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(133)

问题是:游戏Totals可以由任何数量的人玩。它以总数100开始,每个玩家依次对总数进行-20和20之间的整数位移。赢家是调整使总数等于5的玩家。仅使用给定的三个变量:总调整计数器这是我迄今为止所做的:

#include <stdio.h>
int main (void)
{
    int counter=0;
    float adj;
    int ttl=100;

    printf("You all know the rules now lets begin!!!\n\n\nWe start with 100. What is\n");

    while (ttl!=5)
    {
        printf("YOUR ADJUSTMENT?");
        scanf("%f",&adj);
        counter++;
        if (adj<=20 && adj>=-20)
        {
            ttl=ttl+adj;
            printf("The total is %d\n",ttl);
        }
        else
        {
            printf ("I'm sorry. Do you not know the rules?\n");
        }
    }
    printf("The game is won in %d steps!",counter);

}

字符串
我需要的:当输入一个十进制数时,它会转到else。我如何确定一个浮点数是否有小数部分。

hivapdat

hivapdat1#

你可以将float转换为int,然后将它与原始变量进行比较。如果它们相同,则没有小数部分。
通过使用此方法,不需要临时变量或函数调用。

float adj;

  ....     

  if (adj == (int)adj)
    printf ("no fractional!\n");
  else
    printf ("fractional!\n");

字符串

说明

由于int不能处理分数,因此float的值将被截断为int(例如(float)14.3将被截断为(int)14)。
当比较1414.3时,很明显它们不是相同的值,因此将打印“fractional!”。

5kgi1eie

5kgi1eie2#

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

int main ()
{
  float param, fractpart, intpart;

  param = 3.14159265;
  fractpart = modff (param , &intpart);
  return 0;
}

字符串
http://www.cplusplus.com/reference/clibrary/cmath/modf/
modff找到小数部分,所以我想测试它是否等于0null将回答你的问题。

ylamdve6

ylamdve63#

如果你想知道一个真实的数x是否没有小数部分,试试x==floor(x)

9avjhtql

9avjhtql4#

我只学C所以如果我错了请告诉我。
但如果不用

scanf("%f",&adj);

字符串
如果您用途:

scanf("%d%d", &adj, &IsUndef);


因此,如果用户键入整数以外的任何内容,&IsUndef将不等于NULL,并且必须具有小数部分,以将用户发送到其他位置。
也许吧

brc7rcf0

brc7rcf05#

使用scanf()是有问题的。如果用户在输入的第一行输入-5 +10 -15 -15,然后点击回车,你会依次用scanf()处理4个数字。这可能不是你想要的。当然,如果用户输入+3 or more,那么一旦读取空格,第一次转换就会停止,所有后续的转换在oor上都失败了,代码进入了一个循环。你必须检查scanf()的返回值,以知道它是否能够转换任何东西。
预读问题非常严重,我会选择准标准的替代方案,即使用fgets()读取一行数据,然后使用sscanf()(额外的s非常重要)解析一个数字。
要确定浮点数是否有小数部分和整数部分,您可以使用modf() or modff()函数-后者,因为您的adjfloat

#include <math.h>

double modf(double x, double *iptr);
float modff(float value, float *iptr);

字符串
返回值是x的带符号小数部分; iptr中的值是整数部分。请注意,modff()在编译器中可能不可用(运行时库)不支持C99。在这种情况下,您可能必须使用doublemodf()。但是,限制用户只能输入%d的整数和adj的整数类型可能同样简单;我从一开始就这么做了。
另一个细节:你真的想把无效的数字计入总尝试次数吗?

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

int main(void)
{
    int counter=0;
    int ttl=100;

    printf("You all know the rules now lets begin!!!\n"
           "\n\nWe start with 100. What is\n");

    while (ttl != 5)
    {
        char  buffer[4096];
        float a_int;
        float adj;

        printf("YOUR ADJUSTMENT?");
        if (fgets(buffer, sizeof(buffer), stdin) == 0)
            break;
        if (sscanf("%f", &adj) != 1)
            break;
        if (adj<=20 && adj>=-20 && modff(adj, &a_int) == 0.0)
        {
            counter++;  // Not counting invalid numbers
            ttl += adj;
            printf("The total is %d\n", ttl);
        }
        else
        {
            printf ("I'm sorry. Do you not know the rules?\n");
        }
    }

    if (ttl == 5)
        printf("The game is won in %d steps!\n", counter);
    else
        printf("No-one wins; the total is not 5\n");
    return(0);
}


很明显,我故意忽略了在输入return之前输入超过4095个字符的可能性。

相关问题