我可以使用带有>>运算符的std:fixed或std :: setprecision()吗?

I. *_*mad 2 c++ floating-point qnx

std::istringstream将字符串转换为long double时会丢失精度.我可以使用类似的东西std::fixed还是std::setprecision()?

我正在使用c ++ 11并以QNX平台为目标.

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>

int main(){
    long double convertedNumber;
    std::string numberString ("5.94865747678615882510631e+4931");

    //From string to long double
    std::istringstream iss(numberString);
    iss >> convertedNumber;

    std::cout<< std::setprecision(30) << numberString << "\n";
    std::cout<< std::setprecision(30) << convertedNumber << "\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是

5.94865747678615882510631e+4931
5.9486574767861588254e+4931
Run Code Online (Sandbox Code Playgroud)

Xir*_*ema 6

您遇到的问题与您的使用setprecision或流无关.

80位双long double精度()不足以存储您想要以您想要的精度存储的数字.80位双精度的尾数为64位,这意味着它可以表示的数字精度与64位整数相同,后者本身仅限于19 [十进制]数值.您尝试存储的值是(5.9486_57476_78615_88251_0631)24位十进制数值,这意味着它太精确,无法由您的程序准确表示.

如果要将此值存储在程序中,则需要将其保存在字符串表示形式中,或者找到用于表示/操作这些数字的任意精度库.我的建议是使用boost.multiprecision库,但它取决于您的组织/任务允许使用C++ Boost库.