-1

将字符串转换为长双精度时,我在 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

4

1 回答 1

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。

这意味着只有前 6 位 (4931-4925)originalNumber是正确的;如果您使用科学记数法,这是有道理的。

解决方案std::fixed如 SO 问题“如何使用 cout 以全精度打印双精度值?”中所述。

ostr << std::fixed << originalNumber;
// ...
if (originalNumber == convertedNumber) // true
    std::cout<< "The same\n";
else
    std::cout<< "Not the same\n";

现场演示

但请注意,浮点数学可能会出现问题,并且比较两个浮点数==通常不是一个好的选择。

于 2018-12-28T12:31:04.967 回答