如何准确打印浮点数或双精度类型变量的小数点后 100 位?

How to print upto 100th decimal places accurately of a float or double type variable?

假设有两个数字 22 和 7。我想打印答案的小数点后第 100 位,它应该看起来像 3.1428571428571428571428571.... 而尝试使用

cout << setprecision(100) << fixed << (22.0/7.0); 

我得到类似 3.142857142857142793701541449991054832935333251953125......

当我尝试时

int main()
{
   const long double pi = 22.0/7.0;
   std::cout << std::setprecision(std::numeric_limits<long double>::max()) << pi << '\n';
}

我遇到分段泄漏问题。

您获得的最大值是:

int main()
{
    const long double pi = 22.0/7.0;
    std::cout << std::setprecision(std::numeric_limits<long double>::digits) <<   pi << '\n';
}

输出为: 3.142857142857142793701541449991054832935333251953125

一般在c++中,double(两者中较大的)存储在8个字节中。 这意味着该数字可以包含 2^8*8 = 2^64 字节(^ = 幂)。 这意味着在保留符号和浮点位置之后,点后的最大位数最多为 ~15 位。因此,您将不得不创建其他方法,然后为该计算加倍。 这是我的参考: https://www.tutorialspoint.com/cplusplus/cpp_data_types.htm

打印不是问题。代码很好地将商 打印为 double.

cout << setprecision(100) << fixed << (22.0/7.0);

OP's reported result
3.142857142857142793701541449991054832935333251953125.......
// My expected result of the double 22.0/7.0
3.1428571428571427937015414499910548329353332519531250000000....

使用 double 数学一般不会提供 100 位精度的 OP。这就是原因。

解释方式不同

A double 通常是 64 位。这给出了 264 可完全表示的 数字的组合。考虑 double n,d,q; 并除以 n/d。那是 n,d 的 2128 种不同组合,但我们正试图将所有这些结果放在 q 中。许多会得到相同的答案(22.0/11.0 和 14.0/7.0 都为 2.0)。然而,肯定有超过 264 个不同的数学答案。

所以 C rounds 最好的答案 - 通常最接近 - representable double

在这种情况下:22.0/7.0,确切地说,不属于那些 264 组合之一。
"best" 是 "something like 3.142857 142857 142793 7015414..."

double x = 22.0/7.0;
//  x   3.142857 142857 142793 701...

// 22.0/7.0
// math 3.142857 142857 142857 142857 

double next_x = nextafter(22.0/7.0, 4.0);
//      3.142857 142857 143237 790...

试试这个,将答案四舍五入到小数点后 100 位。

    double long a,b,n;
    cin>>a>>b;
    n=a/b;
    std::cout << std::fixed;
    std::cout << std::setprecision(100);
    std::cout << n << '\n';