2015-09-26 1 views
2

В настоящее время работает над заданием и немного застревает. Мы должны преобразовать температуру от Цельсия до Фаренгейта. В конечном ответе должен выводиться номер с плавающей точкой, если ответ является десятичным или целое, если это целое число. Я настроил его, чтобы дать мне число с плавающей запятой, но когда я введу число, скажем, «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; 
} 

ответ

1

Вы печатаете свой номер как поплавок, чтобы распечатать его как целое:

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

Он использует спецификатор d преобразования для десятичной печати и аргумент отлитый в int, как %d требует int.

2

Действительно, это не так, как вы описали. То, что действительно звучит так, как вы хотите, - это лучшее форматирование строк. Попробуйте использовать %g вместо %f в вашем printf (за this сообщение).

например.

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; 

}

+0

Это сработало отлично! Благодаря тонну! –

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); 
} 
+0

Большое спасибо за информацию. Для чего мне нужно, я просто использую метод Джошуа, он достаточно близко к ожидаемому. Но я буду хранить ваши данные и мысли и добавлять их в будущее, потому что я уверен, что мне это понадобится. Спасибо! –

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; 
} 
Смежные вопросы