我有一个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;
}
答案 0 :(得分:3)
这个数字太大而不适合单个双精度数,所以它被截断了。
答案 1 :(得分:2)
将整数存储而不会失去精确度存储到双打时有一个限制,因为这个答案总结了很多:https://stackoverflow.com/a/1848762/1938163
精度损失首先发生在2 ^ 53 + 1并且您的数字正好大于
9007199254740993
1234567890987654321
答案 2 :(得分:1)
这个数字对于双重表示来说太大了,所以它被截断了。请注意,“long double”类型的大小取决于架构。
请查看此处MSDN:sizeof(double)=8
和sizeof(long double)=8
,而在Debian 64位上执行的相同检查显示sizeof(double)=8
和sizeof(long double)=16
。
也许更便携的方式是使用处理大数字的外部库,比如 boost multiprecision或GNU GMP