2009-11-10 19 views
8

J'ai une base de données remplie de doubles comme celui qui suit:chaîne en notation scientifique C++ double conversion

1.60000000000000000000000000000000000e+01 

Quelqu'un sait-il comment convertir un certain nombre comme celui d'un double en C++?

Existe-t-il une façon «standard» de faire ce genre de choses? Ou dois-je lancer ma propre fonction?

En ce moment je fais qqch comme ceci:

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

Merci!

+2

Quel type de base de données? Quel est le schéma de la base de données autour de ce champ? –

+0

Quelle est la précision que vous devez garder de ce nombre? Si, garder cette haute précision n'est pas un problème, vous pouvez simplement "couper" cette chaîne et la convertir en double en utilisant des fonctions C ordinaires. – Andres

+0

Notez que vous devez vérifier l'état du flux de chaînes après en avoir lu le contenu. La lecture peut échouer. – sbi

Répondre

16

Quelque chose comme ça? Ce serait la façon de le faire ...

#include <sstream> 
using namespace std; 

// ... 

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

Prints "C++" 16.

+4

Si vous avez boost, alors 'double d = boost :: lexical_cast (s)' sera faire la même chose. –

+0

Est-ce censé fonctionner si on change le type en "int"? Il semble que je ne sors tout simplement pas, la routine ne peut-elle pas gérer la notation exponentielle, même si elle représente un nombre entier? –

+0

[C'est compliqué] (http://en.cppreference.com/w/cpp/locale/num_get/get) mais probablement pas. – Thomas

7

Vous souhaitez que la fonction c standard soit atof ([A] SCII à [F], mais elle utilise des doubles plutôt que des flottants).

+1

Cela sera beaucoup plus rapide que d'utiliser des objets de flux C++. –

+0

atof convertit en un double comme le OP et le docs dit. – luke

+2

@Heath: Il est toujours facile d'être rapide quand vous sautez des étapes importantes: 'atof (" 0.0 ")' vs 'atof (" blah ")'. (Note: Je n'essaie pas de défendre les flux C++, ils sont _are_ plus lents qu'ils ne devraient l'être, mais ils indiquent les erreurs de façon non ambiguë.) – sbi