Как преобразовать строку в число с плавающей точкой?
#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.
К сожалению, нет способа сделать это легко. Каждое решение имеет свои недостатки.
использование
atof()
или жеstrtof()
напрямую: это то, что большинство людей скажет вам делать, и это будет работать большую часть времени. Однако, если программа устанавливает языковой стандарт или использует библиотеку, которая устанавливает языковой стандарт (например, графическую библиотеку, которая отображает локализованные меню), а для пользователя в качестве языкового стандарта устанавливается язык, в котором десятичный разделитель не является.
(такие какfr_FR
где разделитель,
) эти функции прекратят разбор в.
и вы все равно получите4.0
,использование
atof()
или жеstrtof()
но измените локаль; это вопрос вызоваsetlocale(LC_ALL|~LC_NUMERIC, "");
перед любым звонкомatof()
или лайки. Проблема сsetlocale
в том, что он будет глобальным для процесса, и вы можете вмешиваться в остальную часть программы. Обратите внимание, что вы можете запросить текущую локаль сsetlocale()
и восстановить его после того, как вы закончите.Напишите свою собственную процедуру парсинга. Это может быть довольно быстро, если вам не нужны расширенные функции, такие как анализ степени или шестнадцатеричные числа.
Также обратите внимание, что значение 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().
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);
}