2014-02-06 152 views
1

我有一个string_to_number函数可以将字符串转换为double。为什么在这种情况下这不起作用?这个string_to_number函数有什么问题?

#include <iostream> 
#include <sstream> 
#include <iomanip> 
#include <string> 
using namespace std; 

double string_to_number(string text) 
{ 
    double value; 
    istringstream (text) >> value; 
    return value; 
} 

int main() 
{ 
    string text = "1234567890987654321"; 
    double value = string_to_number(text); 
    cout << fixed << setprecision(0) << value << endl; // 123456789098765400 ??? What happened to "321" ?!! 

    return 0; 
} 
+1

没有什么是错的功能。 [阅读本文](http://www.validlab.com/goldberg/paper.pdf)。 – 2014-02-06 11:24:45

+2

你*有*写自己的?你不能使用例如['std :: stoll'](http://en.cppreference.com/w/cpp/string/basic_string/stol)(或['std :: stold'](http://en.cppreference.com/) W/CPP /串/ basic_string的/ STOF))。 –

+0

您是否尝试以同样的方式执行std :: cout << 1234567890987654321.'? – Jarod42

回答

3

该数字太大而无法放入单个double中,因此它被截断。

+0

我该如何解决它? – mhm

+0

@ M.HosainMa'refat你不能。 – 2014-02-06 11:24:10

+2

你可以使用'long double',否则使用像[GNU GMP](https://gmplib.org/)这样的库进行研究。 – Michael

1

该数字对于双重表示来说太大,所以它被截断。请注意,“长双”类型的大小取决于体系结构。 请看这里MSDNsizeof(double)=8sizeof(long double)=8,而在Debian 64位上执行的相同检查显示sizeof(double)=8sizeof(long double)=16

也许更简便的方式将使用应付大数字外部库,像 boost multiprecision或GNU GMP