2009-11-10 85 views
8

Ho una base di dati riempito con i doppi come la seguente:stringa in notazione scientifica C++ a doppia conversione

1.60000000000000000000000000000000000e+01 

Qualcuno sa come convertire un numero simile a un doppio in C++?

Esiste un modo "standard" per fare questo tipo di cose? O devo svolgere la mia funzione?

In questo momento sto facendo sth come questo:

#include <string> 
#include <sstream> 



int main() { 
    std::string s("1.60000000000000000000000000000000000e+01"); 
    std::istringstream iss(s); 
    double d; 
    iss >> d; 
    d += 10.303030; 
    std::cout << d << std::endl; 
} 

Grazie!

+2

Che tipo di database? Qual è lo schema del database attorno a quel campo? –

+0

Qual è la precisione che è necessario mantenere da questo numero? Se, mantenere alta la precisione non è un problema, puoi semplicemente "tagliare" questa stringa e convertirla in doppia usando le normali funzioni C. – Andres

+0

Si noti che è necessario verificare lo stato del flusso stringa dopo aver letto da esso. La lettura può fallire. – sbi

risposta

16

qualcosa di simile? Questo sarebbe il modo "C++" di farlo ...

#include <sstream> 
using namespace std; 

// ... 

    string s = "1.60000000000000000000000000000000000e+01"; 
    istringstream os(s); 
    double d; 
    os >> d; 
    cout << d << endl; 

Stampe 16.

+4

Se hai spinta, poi 'double d = boost :: lexical_cast (s)' sarà fare la stessa cosa –

+0

È supposto che funzioni se cambiamo il tipo in "int"? Mi sembra di ottenere solo lo zero fuori, può la routine non gestire la notazione esponenziale, anche se si sta rappresentando un intero? –

+0

[E 'complicato] (http://en.cppreference.com/w/cpp/locale/num_get/get) ma probabilmente non. – Thomas

7

Si desidera la funzione c standard atof ([A] da SCII a [F] loat, ma in realtà utilizza il doppio anziché il float).

+1

Questo sarà molto più veloce rispetto all'utilizzo di oggetti di flusso C++. –

+0

atof converte in doppio come il PO e la documentazione dice. – luke

+2

@Heath: E 'sempre facile essere veloce quando si salta passi importanti: 'atof ("0.0")' 'vs. atof ("bla")'. (Nota: Non sto cercando di difendere i flussi C++, che _sono_ più lento di quello che dovrebbe essere, ma lo fanno indicare gli errori in modo inequivocabile..) – sbi

Problemi correlati