C++ 为什么我会得到C++;当双精度为15位时,双精度数据类型错误 #包括 #包括 使用名称空间std; int main() { 双b=1.9876543212987; cout

C++ 为什么我会得到C++;当双精度为15位时,双精度数据类型错误 #包括 #包括 使用名称空间std; int main() { 双b=1.9876543212987; cout,c++,C++,1.9876543212987小数点后12位是1.987654321230。然后删除尾随的零,因此得到1.98765432123。这解释了为什么只得到11位小数 没有简单的方法可以阻止它向上舍入数字。毕竟,最接近的可能值是大多数人想要的。似乎您应该做的是以最大精度将输出写入字符串,然后对最后的数字进行一些字符串操作。这样您可以保留尾随的零,截断而不是舍入等。看起来像这样“的四舍五入到最近的有效位。为什么它应该是结尾处的3212?下面的数字是9,因为它大于5,所以您可以将2四舍五入到3。也可以具体

1.9876543212987
小数点后12位是
1.987654321230
。然后删除尾随的零,因此得到
1.98765432123
。这解释了为什么只得到11位小数


没有简单的方法可以阻止它向上舍入数字。毕竟,最接近的可能值是大多数人想要的。似乎您应该做的是以最大精度将输出写入字符串,然后对最后的数字进行一些字符串操作。这样您可以保留尾随的零,截断而不是舍入等。

看起来像这样“的四舍五入到最近的有效位。为什么它应该是结尾处的
3212
?下面的数字是
9
,因为它大于
5
,所以您可以将
2
四舍五入到
3
。也可以具体参见此处的示例
std::setprecision(10)
最大精度:
结果我理解向上取整的部分,但我不明白为什么我将精度设置为12时它只有11位?谢谢你的回答,顺便说一句,我不希望它会这么快。还有什么方法可以阻止它向上取整吗?
#include<iomanip>
#include <iostream>

using namespace std;

int main()
{
   double b = 1.9876543212987 ;
   cout<<"double: "<<setprecision(12)<<b<<endl;
}