在我之前的问题中,我打印了一个double using cout,当我没有预料到它时,它变得圆润了。我如何才能使cout打印一个双重使用全精度?
当前回答
利用std::设置精度:
#include <iomanip>
std::cout << std::setprecision (15) << 3.14159265358979 << std::endl;
其他回答
最轻松的……
#include <limits>
using std::numeric_limits;
...
cout.precision(numeric_limits<double>::digits10 + 1);
cout << d;
以下是我会使用的方法:
std::cout << std::setprecision (std::numeric_limits<double>::digits10 + 1)
<< 3.14159265358979
<< std::endl;
基本上,限制包具有所有内置类型的特性。 浮点数(float/double/long double)的特征之一是digits10属性。这定义了以10为基底的浮点数的精度(我忘记了确切的术语)。
参见:http://www.cplusplus.com/reference/std/limits/numeric_limits.html 查看其他属性。
在这个问题中,有一个关于如何无损地将double类型转换为字符串的描述(在Octave中,但它可以很容易地在c++中重现)。我们的想法是对浮点数有一个人类可读的简短描述和一个十六进制形式的无损描述,例如:pi -> 3.14{54442d18400921fb}。
printf("%.12f", M_PI);
%。12f表示浮点数,精度为12位。
利用std::设置精度:
#include <iomanip>
std::cout << std::setprecision (15) << 3.14159265358979 << std::endl;