如何根据输入的数字来回答浮点数或整数?

时间:2015-09-26 00:26:41

标签: c floating-point integer temperature

目前正在进行任务并且有点困难。我们要将温度从摄氏温度转换为华氏温度。如果答案是小数,则最终答案应输出浮点数,如果是整数,则输出整数。我把它设置为给我一个浮点数,但是当我输入一个数字,比如'98 .6'时,我会得到37.00000而不是37个。试了几个小时试图自己对抗但是我已经没有想法了。谢谢你的帮助!

int main(void)
{
    float ftemp;
    float ctemp;    

        printf ("Enter a temperature in Fahrenheit: ");
    scanf ("%f", &ftemp);
    ctemp = (100.0 / 180.0) * (ftemp - 32);
    printf ("In Celsius, your temperature is %f!\n", ctemp);

    return 0;
}

4 个答案:

答案 0 :(得分:2)

正如你所描述的那样,确实没有一种好方法可以做到这一点。你真正想要的是更好的字符串格式。请尝试在%g(每this个帖子)中使用%f代替printf

e.g。

printf ("In Celsius, your temperature is %g!\n", ctemp);

现在,如果你真的想让它使用一个整数,那么你最接近的就是:

int main(void)
{
    float ftemp;
    float ctemp;
    int   ctempi;    

    printf ("Enter a temperature in Fahrenheit: ");
    scanf ("%f", &ftemp);
    ctemp = (100.0 / 180.0) * (ftemp - 32);
    ctempi = (int)ctemp;
    if(ctemp == ctempi) {
         printf("In Celsius, your temperature is %d\n", ctempi);
    } else {
         printf ("In Celsius, your temperature is %f!\n", ctemp);
    }

    return 0;

}

答案 1 :(得分:1)

您将数字打印为浮点数,以整数形式打印:

fmap

它使用printf ("In Celsius, your temperature is %d!\n", (int) ctemp); 转换说明符进行十进制打印,参数将转换为d,因为int需要%d

答案 2 :(得分:0)

浮点数的一个棘手问题是它们并不精确。可以用十进制表示而不重复数字的数字可能具有二进制的重复数字。

因此,您需要检查结果是否为整数,但由于浮点的不精确性,(1.0 / 3.0 * 3) == 1可能会评估为false。所以你需要看看它是否在一个整数的某个阈值内。

if (fabs(ctemp - roundf(ctemp)) < 0.0001) {
    // result is close enough to an integer, so print as integer
    printf ("In Celsius, your temperature is %d!\n", (int)ctemp);
} else {
    // result is not an integer, so print as a float
    printf ("In Celsius, your temperature is %f!\n", ctemp);
}

答案 3 :(得分:0)

将输入作为字符串读取并测试整数。

#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>

struct dual {
  char type;
  union {
    int i;
    float f;
  } u;
} dual_T;

dual_T GetNumber(void) {
  dual_T number;
  float f;
  char buf[100];
  if (fgets(buf, sizeof buf, stdin) == NULL) {
    number.type = 'n';
    return number;
  }

  // test for float - sample code possibility
  int n = 0;
  sscanf(buf, "%f %n", &f, &n);
  bool f_possible = n > 0 && *n == 0;

  // test for int - sample code possibility
  n = 0;
  sscanf(buf, "%i %n", &number.u.i, &n);
  bool i_possible = n > 0 && *n == 0;

  if (f_possible) {
    if (i_possible) {
      // If fits as an `int`, go with `int` as likely higher precision.
      if (f >= INT_MIN && f <= INT_MAX) {
        number.type = 'i';
        return number;
      }
    }
    number.type = 'f';
    number.u.f = f;
  } else {
    if (i_possible) {
      number.type = 'i';
    } else {
      number.type = 'n'; // none
    }
  }
  return number;
}