Как преобразовать строку в число с плавающей точкой?

#include<stdio.h>
#include<string.h>

int main() 
{
    char s[100] ="4.0800" ; 

    printf("float value : %4.8f\n" ,(float) atoll(s)); 
    return 0; 
}

Я ожидаю, что результат должен быть 4.08000000 тогда как я получил только 4.00000000,

Есть ли способ получить цифры после точки?

9 ответов

Использование atof() или же strtof()* вместо:

printf("float value : %4.8f\n" ,atof(s)); 
printf("float value : %4.8f\n" ,strtof(s, NULL)); 

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
http://www.cplusplus.com/reference/cstdlib/strtof/

  • atoll() предназначен для целых чисел.
  • atof()/strtof() для поплавков.

Причина, почему вы получаете только 4.00 с atoll() это потому, что он прекращает синтаксический анализ, когда находит первую не цифру.

*Обратите внимание, что strtof() требует C99 или C++11.

К сожалению, нет способа сделать это легко. Каждое решение имеет свои недостатки.

  1. использование atof() или же strtof() напрямую: это то, что большинство людей скажет вам делать, и это будет работать большую часть времени. Однако, если программа устанавливает языковой стандарт или использует библиотеку, которая устанавливает языковой стандарт (например, графическую библиотеку, которая отображает локализованные меню), а для пользователя в качестве языкового стандарта устанавливается язык, в котором десятичный разделитель не является . (такие как fr_FR где разделитель ,) эти функции прекратят разбор в . и вы все равно получите 4.0,

  2. использование atof() или же strtof() но измените локаль; это вопрос вызова setlocale(LC_ALL|~LC_NUMERIC, ""); перед любым звонком atof() или лайки. Проблема с setlocale в том, что он будет глобальным для процесса, и вы можете вмешиваться в остальную часть программы. Обратите внимание, что вы можете запросить текущую локаль с setlocale() и восстановить его после того, как вы закончите.

  3. Напишите свою собственную процедуру парсинга. Это может быть довольно быстро, если вам не нужны расширенные функции, такие как анализ степени или шестнадцатеричные числа.

Также обратите внимание, что значение 4.08 не может быть представлен точно как float; фактическое значение, которое вы получите 4.0799999237060546875,

Почему нельзя использовать функцию atof() для преобразования строки в double?

В случае успеха функция atof() возвращает преобразованное число с плавающей запятой в виде двойного значения. Если действительное преобразование не может быть выполнено, функция возвращает ноль (0.0). Если преобразованное значение будет вне диапазона представимых значений двойным числом, это приведет к неопределенному поведению.

Ссылка: http://www.cplusplus.com/reference/cstdlib/atof/

Вместо этого используйте функцию strtod (), это более надежно.

Попробуйте этот код:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char s[100] = "4.0800";
    printf("Float value : %4.8f\n",strtod(s,NULL));
    return 0;
}

Вы получите следующий вывод:

Float value : 4.08000000

Использование atof()

Но это не рекомендуется, используйте это вместо:

const char* flt = "4.0800";
float f;
sscanf(flt, "%f", &f);

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/

atof() возвращается 0 как для отказа, так и для преобразования 0.0Лучше всего не использовать его.

Используя sscanf, мы можем преобразовать строку в число с плавающей точкой.

#include<stdio.h>    
#include<string.h>    

int main() 
{
    char str[100] ="4.0800" ;     
    const char s[2] = "-";   
    char *token;
    double x;
   /* get the first token */ 
   token = strtok(str, s);
   sscanf(token,"%f",&x);
    printf( " %f",x );

    return 0; 
}

Напоминание: при использовании atof() убедитесь, что в вашей строке нет «». atof("1.123") вернет 0.000 или что-то в этом роде.

Решение

      str_val[0] = "0";
str_val[len-1] = "\n"; //len = length of string

Вы хотите использовать функцию atof().

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/

double x;

char *s;

s = " -2309.12E-15";

x = atof(s);     /* x = -2309.12E-15 */

printf("x = %4.4f\n",x);
Main()  {
    float rmvivek,arni,csc;
    char *c="1234.00";
    csc=atof(c);
    csc+=55;
    printf("the value is %f",csc);
}
Другие вопросы по тегам