确定浮子是否有小数部分?

时间:2011-12-18 02:10:02

标签: c floating-point floating-point-conversion

问题在于:游戏总计可以由任意数量的人玩。它从总共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。如何确定浮点数是否具有小数部分。

4 个答案:

答案 0 :(得分:15)

您可以将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进行比较时,显然它们的价值不同,因此“小数”!将被打印。

答案 1 :(得分:13)

#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会回答你的问题。

答案 2 :(得分:3)

如果您想知道实数x是否没有小数部分,请尝试x==floor(x)

答案 3 :(得分:0)

使用scanf()是有问题的。如果用户在输入的第一行输入-5 +10 -15 -15,然后点击返回,则会使用scanf()依次处理4个数字。这可能不是你想要的。此外,当然,如果用户键入+3 or more,则在读取空格后第一次转换会停止,并且oor上的所有后续转换都会失败,并且代码会进入一个循环。您必须检查scanf()的返回值,以了解它是否能够转换任何内容。

预读问题非常严重,我会选择使用fgets()读取一行数据的准标准替代方案,然后使用sscanf()(额外{{1}解析一个数字是非常重要的。

要确定浮点数是否包含小数部分以及整数部分,您可以使用modf() or modff()函数 - 后者,因为sadj:< / p>

float

返回值是#include <math.h> double modf(double x, double *iptr); float modff(float value, float *iptr); 的带符号小数部分; x中的值是整数部分。请注意,iptr可能在不支持C99的编译器(运行时库)中不可用。在这种情况下,您可能必须使用modff()double。但是,限制用户输入modf()格式的整数和%d的整数类型可能很简单;这就是我从一开始就做的事情。

另一个细节问题:你真的想要计算总尝试次数中的无效数字吗?

adj

很明显,我刻意忽略了在输入回复之前有人可能输入超过4095个字符的可能性。