13 stelligen String in Double Variablen speichern - Wie?



  • Hallo Zusammen,
    ich habe ein kleines Problem mit einer Double Variablen. Ich habe auf meinem Form ein Label in dem eine 13 stellige Zahl steht. Diese Zahl möchte ich jetzt in einer Double-Variablen speichern. Wie kann ich das machen?

    Probiert habe ich es schon mit StrToFloat. Leider habe ich dann nicht die richtige Zahl. Ich habe jetzt auch gelesen, dass Flaot nur 8 Stellen lang ist. Gibt es etwas wie StrToDouble?

    Danke im voraus.



  • Du könntest es zum Beispiel so machen.

    #include <sstream>
    using namespace std;
    
    ...
    
    double number;
    stringstream s;
    s.str("3.14159265");
    s >> number;
    

    Ein double hat eine Genauigkeit von etwa 16 Dezimalstellen. Merke, dass aber nicht jede endliche dezimale Kommazahl als endliche Binäre Kommazahl darstellbar ist. Die Zahl 0.1 ist im Binärsystem periodisch.



  • Und wenn ich keine Dezimalstellen habe? Es ist immer eine Zahl ohne Nachkommastellen.



  • EPMS schrieb:

    Und wenn ich keine Dezimalstellen habe? Es ist immer eine Zahl ohne Nachkommastellen.

    Dann hast du mit periodischen Kommazahlen keine Probleme.

    Dann könntest du aber auch einen 64-Bit Integer nehmen. In dem Code einfach double durch den entsprechenden Typ ersetzen.

    Die Frage ist, warum du unbedingt eine so große Zahl speichern musst und was du damit vor hast.



  • Die Zahl ist ein Barcode von einer Karte. Je nach Anzahl der Karten muss ich den Barcode einlesen, die Zahl um eins erhöhen und die Prüfziffer anhängen. Und ich möchte ungern nur einen Teil der Zahl nehmen.



  • EPMS schrieb:

    Die Zahl ist ein Barcode von einer Karte. Je nach Anzahl der Karten muss ich den Barcode einlesen, die Zahl um eins erhöhen und die Prüfziffer anhängen. Und ich möchte ungern nur einen Teil der Zahl nehmen.

    Das ist verständlich. Dann würde ich an deiner Stelle lieber 64-Bit Integer oder eine Big-Number Bibliothek verwenden. Dann kriegst du auch keine Probleme mit Rundungsfehlern.



  • Welchen Typ würdest du da empfehlen?

    Frage noch zu deinem Codebeispiel... Wie bekomme ich den Wert aus meinem Edit->Text in den stringstream s?

    Wenn ich es so probiere:

    s.str(Edit->Text.SubString(1,12))
    

    bekomme ich eine Fehlermeldung.

    Keine Übereinstimmung für 'stringstream::str(AnsiString)' gefunden



  • Die Originalzahl sieht so aus: 9700107448583
    Ich habe es jetzt mal so probiert:

    AnsiString Gutschein1;
    double GutscheinAnfang = 0;
    stringstream s;
    
    Gutschein1 = EGutscheincode1->Text.SubString(1,12);
    s << Gutschein1.c_str();
    s >> GutscheinAnfang;
    

    Leider hat GutscheinAnfang dann einen Wert der so aussieht:

    9.7001074486E+11



  • Hallo

    Einfach den Datentyp wechseln

    __int64 GutscheinAnfang = 0;
    

    bis bald
    akari



  • Super. Danke schön. Hatte auch schon long double probiert. Das ging aber auch nicht.



  • EPMS schrieb:

    Super. Danke schön. Hatte auch schon long double probiert. Das ging aber auch nicht.

    Du musst einstellen, wie genau dir der double Wert ausgegeben werden soll. Das

    #include <iostream>
    #include <sstream>
    using namespace std;
    
    int main()
    {
        double number;
        stringstream s;
        s.str("1234567890123");
        s >> number; 
    
        cout.precision(16);
        cout<<number<<endl;
    
        return 0;
    }
    

    sollte funktionieren. Aber wie gesagt: 64-Bit Integer sind in deinem Fall eine bessere Wahl.


Anmelden zum Antworten