将字符串转换为long double时,我在QNX中失去了精度。你知道如何解决这个问题吗?
我正在使用c ++。我试过两次和浮动,没有问题。
#include <iostream>
#include <string>
#include <limits>
#include <sstream>
int main(){
long double originalNumber = std::numeric_limits<long double>::max() / 2;
long double convertedNumber;
// From long double to string
std::ostringstream ostr;
ostr << originalNumber;
std::string tmp_str = ostr.str();
//From string to long double
std::istringstream istr(tmp_str);
istr >> convertedNumber;
// Check if they are similar
if (originalNumber == convertedNumber)
std::cout<< "The same\n";
else
std::cout<< "Not the same\n";
return 0;
}
结果始终为Not the same
答案 0 :(得分:3)
这是因为ostr << originalNumber;
对浮点数使用默认格式,这是对大数字的科学提示。
#include <iostream>
#include <limits>
int main()
{
long double const originalNumber = std::numeric_limits<long double>::max() / 2;
std::cout << originalNumber << '\n'; // 5.94866e+4931
}
当您将该表示解析回浮点数时,以下所有数字都会丢失。实际上,如果您查看数量级:
originalNumber
约为1e4931; originalNumber - convertedNumber
大约是1e4925。这意味着originalNumber
的前6位(4931-4925)是正确的;如果您使用科学记数法,这是有道理的。
解决方法是std::fixed
,如SO问题"How do I print a double value with full precision using cout?"所述:
ostr << std::fixed << originalNumber;
// ...
if (originalNumber == convertedNumber) // true
std::cout<< "The same\n";
else
std::cout<< "Not the same\n";
请注意,floatting-point mathematic can appear to be broken并将两个浮点数与==
进行比较通常不是一个好选择。