Cómo convertir cadena a flotante?

#include #include int main() { char s[100] ="4.0800" ; printf("float value : %4.8f\n" ,(float) atoll(s)); return 0; } 

Espero que la salida sea de 4.08000000 mientras que solo obtuve 4.00000000 .

¿Hay alguna forma de obtener los números después del punto?

Use atof() o strtof() * en su lugar:

 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() es para enteros.
  • atof() / strtof() es para flotadores.

La razón por la que solo obtiene 4.00 con atoll() es porque detiene el análisis cuando encuentra el primer dígito que no es.

* Tenga en cuenta que strtof() requiere C99 o C ++ 11.

Desafortunadamente, no hay forma de hacer esto fácilmente. Cada solución tiene sus inconvenientes.

  1. Use atof() o strtof() directamente: esto es lo que la mayoría de la gente le dirá que haga y funcionará la mayor parte del tiempo. Sin embargo, si el progtwig establece una configuración regional o utiliza una biblioteca que establece la configuración regional (por ejemplo, una biblioteca de gráficos que muestra menús localizados) y el usuario tiene su configuración regional establecida en un idioma donde no es el separador decimal . (como fr_FR donde está el separador , ) estas funciones dejarán de analizarse en el . y aún obtendrás 4.0 .

  2. Use atof() o strtof() pero cambie la configuración regional; es una cuestión de llamar a setlocale(LC_ALL|~LC_NUMERIC, ""); antes de cualquier llamada a atof() o los me gusta. El problema con setlocale es que será global para el proceso y usted puede interferir con el rest del progtwig. Tenga en cuenta que puede consultar la configuración regional actual con setlocale() y restaurarla una vez que haya terminado.

  3. Escribe tu propia rutina de análisis flotante. Esto podría ser bastante rápido si no necesita características avanzadas como el análisis de exponente o flotantes hexadecimales.

Además, tenga en cuenta que el valor 4.08 no se puede representar exactamente como un flotante; el valor real que obtendrá es 4.0799999237060546875 .

¿Por qué uno no debería usar la función atof () para convertir cadena a doble?

En caso de éxito, la función atof () devuelve el número de punto flotante convertido como un valor doble. Si no se puede realizar una conversión válida, la función devuelve cero (0.0). Si el valor convertido estaría fuera del rango de valores representables por un doble, causa un comportamiento indefinido .

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

En su lugar use la función strtod () , es más robusto.

Prueba este código:

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

Obtendrá el siguiente resultado:

Float value : 4.08000000

Usar atof()

Pero esto está en desuso, use esto en su lugar:

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

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

atof() devuelve 0 tanto para la falla como para la conversión de 0.0 , es mejor no usarla.

Al usar sscanf podemos convertir cadenas en flotantes.

 #include #include 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; } 
 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); }