2014-02-06 204 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