Как преобразовать строку в число с плавающей точкой? - PullRequest
46 голосов
/ 31 октября 2011
#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.

Есть ли способ получить числа после точки?

Ответы [ 8 ]

55 голосов
/ 31 октября 2011

Используйте 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.

28 голосов
/ 31 октября 2011

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

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

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

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

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

17 голосов
/ 31 июля 2014

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

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

Refrence: 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

4 голосов
/ 31 октября 2011

Использовать atof()

Но это устарело, используйте вместо этого:

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

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

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

1 голос
/ 05 января 2017

Используя 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; 
}
0 голосов
/ 12 декабря 2014
Main()  {
    float rmvivek,arni,csc;
    char *c="1234.00";
    csc=atof(c);
    csc+=55;
    printf("the value is %f",csc);
}
0 голосов
/ 29 мая 2013
double x;

char *s;

s = " -2309.12E-15";

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

printf("x = %4.4f\n",x);
0 голосов
/ 31 октября 2011

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

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

...