如何使用cout以完全精度打印双精度值?

所以我已经得到了最后一个问题的答案(我不知道为什么我没有想到这一点)。 我正在用cout打印一个double ,当我不期待的时候。 我怎样才能让cout使用全精度打印double精度?

你可以直接在std::cout上设置精度,并使用std::fixed格式说明符。

 double d = 3.14159265358979; cout.precision(17); cout << "Pi: " << fixed << d << endl; 

你可以#include <limits>来获得float或double的最大精度。

 #include <limits> typedef std::numeric_limits< double > dbl; double d = 3.14159265358979; cout.precision(dbl::max_digits10); cout << "Pi: " << fixed << d << endl; 

使用std :: setprecision:

 std::cout << std::setprecision (15) << 3.14159265358979 << std::endl; 

这是我会用的:

 std::cout << std::setprecision (std::numeric_limits<double>::digits10 + 1) << 3.14159265358979 << std::endl; 

基本上限制包具有所有构buildtypes的特征。
浮点数(float / double / long double)的一个特点是digits10属性。 这定义了以10为底的浮点数的准确性(我忘记了确切的术语)。

请参阅: http : //www.cplusplus.com/reference/std/limits/numeric_limits.html
有关其他属性的详细信息。

iostreams的方式是笨重的。 我更喜欢使用boost::lexical_cast因为它为我计算出正确的精度。 而且速度也很快

 #include <string> #include <boost/lexical_cast.hpp> using boost::lexical_cast; using std::string; double d = 3.14159265358979; cout << "Pi: " << lexical_cast<string>(d) << endl; 

输出:

Pi:3.14159265358979

这里是如何显示完全精度的双精度:

 double d = 100.0000000000005; int precision = std::numeric_limits<double>::max_digits10; std::cout << std::setprecision(precision) << d << std::endl; 

这显示:

100.0000000000005

max_digits10是唯一表示所有不同的double值所需的位数。 max_digits10表示小数点前后的位数。

不要在std :: fixed中使用set_precision(max_digits10)。
在固定表示法中,set_precision() 仅在小数点后面设置数字的位数。 这是不正确的,因为max_digits10表示小数点前后的位数。

 double d = 100.0000000000005; int precision = std::numeric_limits<double>::max_digits10; std::cout << std::fixed << std::setprecision(precision) << d << std::endl; 

这显示不正确的结果:

100.00000000000049738

以完全的精度,我假设意思足够精确,以显示最接近的预期值,但是应该指出的是double使用base 2表示来存储,而base 2不能像1.1那样表示一些微不足道的东西。 获得实际双精度的完整精度的唯一方法是打印出二进制位(或hex的nybbles)。 这样做的一种方法是将double写入union ,然后打印出该位的整数值。

 union { double d; uint64_t u64; } x; xd = 1.1; std::cout << std::hex << x.u64; 

这将给你的双精度100%准确的精度,并且完全不可读,因为人类无法读取IEEE双格式! 维基百科对如何解释二进制位做了很好的写作。

在较新的C ++中,你可以这样做

 std::cout << std::hexfloat << 1.1; 
 printf("%.12f", M_PI); 

%.12f表示浮点数,精度为12位。

cout是一个对象,它有一堆你可以调用的方法来改变打印的东西的精度和格式。

有一个setprecision(…)操作,但你也可以设置其他东西,如打印宽度等

在IDE的参考中查找cout。

最可移植的…

 #include <limits> using std::numeric_limits; ... cout.precision(numeric_limits<double>::digits10 + 1); cout << d; 

用ostream :: precision(int)

 cout.precision( numeric_limits<double>::digits10 + 1); cout << M_PI << ", " << M_E << endl; 

会屈服

 3.141592653589793, 2.718281828459045 

为什么你不得不说“+1”我不知道,但你从中得到的额外数字是正确的。