在我的之前的问题中,我使用cout
打印了一个double
,但结果被四舍五入了,而我并不希望它这样。如何让cout
以完整精度打印一个double
?
在我的之前的问题中,我使用cout
打印了一个double
,但结果被四舍五入了,而我并不希望它这样。如何让cout
以完整精度打印一个double
?
printf("%.12f", M_PI);
%.12f 这个表示浮点数,精度为 12 位小数。
std::setprecision
,解决方案如下:# include <iostream>
# include <iomanip>
int main()
{
double a = 34.34322;
std::cout<<std::fixed<<a<<std::setprecision(0)<<std::endl;
return 0;
}
cout.setprecision
来执行此操作,我在 std::setprecision
中填充 0 是因为它必须具有一个参数。double pi = 3.141592653589793
,它会打印出 3.141593
。 - ChrisZZ这是一个适用于浮点类型的函数,不仅仅适用于double
,而且在执行后还会将流恢复到之前的状态。不幸的是,它无法良好地与线程交互,但这就是iostream的本质。您需要在文件开头包含以下内容:
#include <limits>
#include <iostream>
template <class T>
void printVal(std::ostream& os, T val)
{
auto oldFlags = os.flags();
auto oldPrecision = os.precision();
os.flags(oldFlags & ~std::ios_base::floatfield);
os.precision(std::numeric_limits<T>::digits10);
os << val;
os.flags(oldFlags);
os.precision(oldPrecision);
}
使用方法如下:
double d = foo();
float f = bar();
printVal(std::cout, d);
printVal(std::cout, f);
如果你想要使用常规插入 <<
运算符,可以使用这个额外的包装代码:
template <class T>
struct PrintValWrapper { T val; };
template <class T>
std::ostream& operator<<(std::ostream& os, PrintValWrapper<T> pvw) {
printVal(os, pvw.val);
return os;
}
template <class T>
PrintValWrapper<T> printIt(T val) {
return PrintValWrapper<T>{val};
}
现在你可以像这样使用它:
double d = foo();
float f = bar();
std::cout << "The values are: " << printIt(d) << ", " << printIt(f) << '\n';
这将显示小数点后两位的值。
#include <iostream>
#include <iomanip>
double d = 2.0;
int n = 2;
cout << fixed << setprecision(n) << d;
请看这里:固定点表示法
使用固定浮点表示法将 str 流的 floatfield 格式标志设置为 fixed。
当 floatfield 设置为 fixed 时,浮点值使用固定点表示法写入:该值用小数部分中指定的精度字段(precision)表示的数字位数完全相同,并且没有指数部分。
设置十进制精度,以在输出操作中格式化浮点值所使用的十进制精度。
如果您熟悉 IEEE 浮点表示标准,则会知道超出标准范围显示浮点数的全精度是不可能的,也就是说,它总是会导致实际值的四舍五入。
你需要先检查值是否在范围内,如果是,则使用:
cout << defaultfloat << d ;
使用默认浮点数表示法,将 floatfield 格式标志设置为 defaultfloat。
当 floatfield 设置为 defaultfloat 时,浮点值使用默认表示法进行写入:表示法使用尽可能多的有效数字,直到流的小数精度(precision),包括小数点前后的数字(如果有)。
这也是 cout
的默认行为,这意味着您不需要显式地使用它。
使用 ostream::precision(int)
cout.precision( numeric_limits<double>::digits10 + 1);
cout << M_PI << ", " << M_E << endl;
将产生
3.141592653589793, 2.718281828459045
我不知道为什么你要说“+1”,但是它可以得到正确的额外数字。
最具可移植性的...
#include <limits>
using std::numeric_limits;
...
cout.precision(numeric_limits<double>::digits10 + 1);
cout << d;