我可以在>>运算符中使用std:fixed或std :: setprecision()吗?

时间:2018-12-28 15:22:54

标签: c++ floating-point qnx

将字符串转换为long double时,

std::istringstream会失去精度。我可以使用类似于std::fixedstd::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;
}

输出为

5.94865747678615882510631e+4931
5.9486574767861588254e+4931

2 个答案:

答案 0 :(得分:6)

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

80位双精度(long double)不够大,无法以所需的精度存储您要存储的数字。 80位双精度数的尾数为64位,这意味着它可以表示的数字精度与64位整数相同,后者本身被限制为19个十进制数字。您要存储的值是(5.9486_57476_78615_88251_0631个24位十进制数字,这意味着它太精确了,无法由程序准确表示。

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

答案 1 :(得分:0)

是的,它将起作用,这些是用于任何流的函数。 流是construct,用于接收和发送字节 流使用

  

<<插入运算符

     

还有>>提取运算符

std :: setprecision函数是stream manipulator 可以应用于任何流 编辑 如果您的问题是为什么它的精度不能达到30,那是因为您在执行

时失去了精度
document.querySelector('.myForm').addEventListener('submit', (event) => {
    event.preventDefault();
    console.log(event.target.username.value);
    console.log(event.target.realname.value);
});

根据您的输入,iss流是最精确的数字。 坚持Xirema的答案以获得更多技术解释和解决方案