判断浮点数是否有小数部分?

问题描述 投票:0回答:5

问题是: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);

}

我需要什么: 当输入十进制数时,它会转到其他数字。如何确定浮点数是否有小数部分。

c floating-point floating-point-conversion
5个回答
26
投票

您可以将

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

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

  float adj;

  ....     

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

解释

由于

int
无法处理分数,因此
float
的值将被截断为
int
(例如
(float)14.3
将被截断为
(int)14
)。

14
14.3
进行比较时,很明显它们不是相同的值,因此是“小数!”将被打印。


15
投票
#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
找到小数部分,所以我想测试它是否等于
0
null
会回答你的问题。


3
投票

如果你想知道实数

x
是否没有小数部分,请尝试
x==floor(x)


1
投票

我只学习C,所以如果我错了,请告诉我。

但是如果不使用

scanf("%f",&adj);

如果您使用:

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

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

也许吧。


0
投票

使用

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

预读问题非常严重,我会选择使用

fgets()
读取一行数据的准标准替代方案,然后使用
sscanf()
(额外的
s
非常重要)来解析一个数字。

要确定浮点数是否具有小数部分和整数部分,您可以使用

modf()
modff()
函数 - 后者因为您的
adj
float
:

#include <math.h>

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

返回值是

x
的有符号小数部分;
iptr
中的值为整数部分。请注意,
modff()
在不支持 C99 的编译器(运行时库)中可能不可用。在这种情况下,您可能必须使用
double
modf()
。然而,限制用户输入
%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 个字符的可能性。

© www.soinside.com 2019 - 2024. All rights reserved.