这个string_to_number函数有什么问题?

时间:2014-02-06 11:21:19

标签: c++ string

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

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

3 个答案:

答案 0 :(得分:3)

这个数字太大而不适合单个双精度数,所以它被截断了。

答案 1 :(得分:2)

查看IEEE format for a double

将整数存储而不会失去精确度存储到双打时有一个限制,因为这个答案总结了很多:https://stackoverflow.com/a/1848762/1938163

精度损失首先发生在2 ^ 53 + 1并且您的数字正好大于

   9007199254740993
1234567890987654321

答案 2 :(得分:1)

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

也许更便携的方式是使用处理大数字的外部库,比如 boost multiprecision或GNU GMP