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

The*_*iac 10 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);

}
Run Code Online (Sandbox Code Playgroud)

我需要的是:当输入十进制数时,它会转到其他位置.如何确定浮点数是否具有小数部分.

Fil*_*efp 17

您可以将其转换float为a int,然后将其与原始变量进行比较.如果它们是相同的,则没有小数部分.

通过使用此方法,不需要临时变量或函数调用.

  float adj;

  ....     

  if (adj == (int)adj)
    printf ("no fractional!\n");
  else
    printf ("fractional!\n");
Run Code Online (Sandbox Code Playgroud)

说明

由于int无法处理分数,您的值float将被截断为int(例如(float)14.3将被截断为(int)14).

当比较1414.3很明显,他们是不一样的价值,并为此"分数!" 将被打印.

  • 你不需要显式转换回`float`,它会自动转换.你的解决方案没有错,我只是把它写成`f ==(int)f`,我觉得它更容易阅读和理解. (2认同)
  • 我不相信使用这种技术的所有答案都很稳健.如果`adj`实际上是中间计算的结果,它可以保存在扩展精度寄存器中.因此,比较可能返回`false`,即使稍后检查`adj`时,它实际上也是一个整数值. (2认同)
  • 您完全确定这有效吗?14 作为浮点数实际上将由 13.9999239894 左右表示。所以大多数时候比较都会失败。 (2认同)

Nee*_*eta 13

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

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

  param = 3.14159265;
  fractpart = modff (param , &intpart);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

http://www.cplusplus.com/reference/clibrary/cmath/modf/

modff找到小数部分,所以我想测试它是否等于0null将回答你的问题.


lhf*_*lhf 3

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