Wie konvertiere ich eine Zeichenfolge in Float?

Lesezeit: 4 Minuten

Benutzeravatar von abucker
abacker

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

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

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

Ich erwarte, dass die Ausgabe sein sollte 4.08000000 während ich nur bekam 4.00000000.

Gibt es eine Möglichkeit, die Zahlen nach dem Punkt zu erhalten?

Benutzeravatar von Mystical
Mystisch

Verwenden atof() oder strtof()* stattdessen:

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() ist für ganze Zahlen gedacht.
  • atof()/strtof() ist für Schwimmer.

Der Grund, warum Sie nur bekommen 4.00 mit atoll() liegt daran, dass es mit dem Parsen aufhört, wenn es die erste Nicht-Ziffer findet.

*Beachten Sie, dass strtof() erfordert C99 oder C++11.

  • printf(“Float-Wert: %4.8f\n” , atof(s)); # Ausgabe: Gleitkommawert: 0,00000000

    – Ababacker

    31. Oktober 2011 um 7:58 Uhr

  • Für Empfehlung herabgestimmt atofdie Parsing-Fehler ignoriert, statt strtof. Das solltest du besser wissen 😉

    – zol

    10. September 2013 um 15:42 Uhr

  • @Zack Ich kann nicht sagen, dass ich vor zwei Jahren überhaupt wusste, dass es das gibt. Zumal es sich anscheinend um eine C99/C++11-Funktion handelt.

    – Mystisch

    10. September 2013 um 16:47 Uhr

  • @Mystcial Oh, richtig, alle Short-Float-Funktionen waren C99. Aber strtod ist in C89 und hat den gleichen Vorteil gegenüber atof (eindeutige Analysefehler melden).

    – zol

    10. September 2013 um 16:51 Uhr

  • Beachten Sie, dass atof() gibt a zurück double, trotz seines Namens. Das Analoge ist strtod() wie strtof() kehrt zurück floatund strtold() kehrt zurück long double.

    – Jonathan Leffler

    4. November 2018 um 5:28 Uhr

Leider gibt es keine Möglichkeit, dies einfach zu tun. Jede Lösung hat ihre Nachteile.

  1. Verwenden atof() oder strtof() direkt: Das werden Ihnen die meisten Leute sagen und es wird die meiste Zeit funktionieren. Wenn das Programm jedoch ein Gebietsschema festlegt oder eine Bibliothek verwendet, die das Gebietsschema festlegt (z. B. eine Grafikbibliothek, die lokalisierte Menüs anzeigt), und der Benutzer sein Gebietsschema auf eine Sprache eingestellt hat, in der das Dezimaltrennzeichen nicht vorhanden ist . (wie zum Beispiel fr_FR wo das Trennzeichen ist ,) stoppen diese Funktionen das Parsen am . und du wirst immer noch bekommen 4.0.

  2. Verwenden atof() oder strtof() aber ändern Sie das Gebietsschema; Es geht darum, anzurufen setlocale(LC_ALL|~LC_NUMERIC, ""); vor jedem Anruf atof() oder ähnliches. Das Problem mit setlocale ist, dass es für den Prozess global ist und Sie den Rest des Programms stören könnten. Beachten Sie, dass Sie das aktuelle Gebietsschema möglicherweise mit abfragen setlocale() und stellen Sie es wieder her, nachdem Sie fertig sind.

  3. Schreiben Sie Ihre eigene Float-Parsing-Routine. Dies kann ziemlich schnell gehen, wenn Sie keine erweiterten Funktionen wie Exponentenanalyse oder hexadezimale Gleitkommazahlen benötigen.

Beachten Sie auch, dass der Wert 4.08 kann nicht genau als Float dargestellt werden; der tatsächliche Wert, den Sie erhalten, ist 4.0799999237060546875.

Warum sollte man die Funktion atof() nicht verwenden, um String in Double umzuwandeln?

Bei Erfolg gibt die Funktion atof() die konvertierte Gleitkommazahl als Double-Wert zurück. Wenn keine gültige Konvertierung durchgeführt werden konnte, gibt die Funktion Null (0,0) zurück. Wenn der konvertierte Wert um ein Doppeltes außerhalb des Bereichs darstellbarer Werte liegen würde, verursacht dies undefiniertes Verhalten.

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

Verwenden Sie stattdessen die Funktion strtod()es ist robuster.

Versuchen Sie diesen Code:

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

Sie erhalten die folgende Ausgabe:

Float value : 4.08000000

  • Ausgezeichnet, ich habe 2 Stunden lang versucht, den Fehler mit atof() zu finden, bis ich das sah. Danke!

    – MasterPJ

    24. Oktober 2014 um 12:50 Uhr

  • Beachten Sie, dass strtod vom Gebietsschema abhängig ist. Einzelheiten finden Sie in der Antwort von Sam Hocevar.

    – 4LegsDrivenCat

    13. März 2017 um 17:28 Uhr

  • Ist nicht strtod Außerhalb des Bereichs für eine markierte Frage c ? Ich weiß, dass es ein C++ ist, aber gut, ich suche nach ANSI C: c

    – Ludovic Zenohate Lagouardette

    24. Juli 2017 um 21:51 Uhr

  • @LudovicZenohateLagouardette strtod() ist in C definiert und liegt im Gültigkeitsbereich. (C11dr 7.22.1.3 Die Funktionen strtod, strtof und strtold)

    – chux – Wiedereinsetzung von Monica

    30. September 2017 um 19:23 Uhr

Verwenden atof()

Dies ist jedoch veraltet, verwenden Sie stattdessen Folgendes:

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

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

atof() kehrt zurück 0 sowohl für den Ausfall als auch für die Konvertierung von 0.0am besten nicht verwenden.

Durch die Verwendung von sscanf können wir String in Float umwandeln.

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

Benutzeravatar von Md Farhan Shakib
Md Farhan Shakib

Erinnerung:
Stellen Sie bei der Verwendung von atof() sicher, dass Ihr String kein “” enthält. atof(“1.123”) gibt 0.000 oder so ähnlich zurück.

Lösung

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

Benutzeravatar von mwp
mwp

Sie möchten die Funktion atof() verwenden.

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

1413040cookie-checkWie konvertiere ich eine Zeichenfolge in Float?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy