std::istringstream
会失去精度。我可以使用类似于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;
}
输出为
5.94865747678615882510631e+4931
5.9486574767861588254e+4931
答案 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的答案以获得更多技术解释和解决方案