目前正在进行任务并且有点困难。我们要将温度从摄氏温度转换为华氏温度。如果答案是小数,则最终答案应输出浮点数,如果是整数,则输出整数。我把它设置为给我一个浮点数,但是当我输入一个数字,比如'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;
}
答案 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;
}