【问题标题】:Why does std::cout print floats, doubles and long doubles to the same decimal precision? [duplicate]为什么 std::cout 将浮点数、双精度数和长双精度数打印到相同的十进制精度? [复制]
【发布时间】:2020-10-13 16:13:12
【问题描述】:

直觉上,我认为长双精度数的小数位比双精度数多,双精度数的小数位比浮点数多,但是,如果是这样,为什么 std::cout 会以相同的小数精度打印出浮点数、双精度数和长双精度数,即使它们对所有原始数据类型都有重载?

C++源代码:

#include <iostream>

#define PI 3.1415926535897932384626433832;

int main()
{
    float f = PI;
    double d = PI;
    long double ld = PI;

    std::cout << f << std::endl;
    std::cout << d << std::endl;
    std::cout << ld << std::endl;

    return 0;
}

输出:

3.14159
3.14159
3.14159

【问题讨论】:

  • 所有类型的花车只有一种设置。浮点、双精度和长双精度不能有不同的精度。
  • @ThomasSablik 这不是为什么标准委员会选择这样做的动机。
  • @MarekR 该标准可以很容易地指定诸如“足以使表示在该精度下明确”之类的内容。这意味着库需要知道特定于实现的细节,但情况已经如此,例如在std::numeric_limits。事实上,这样一个假设的实现甚至可以使用 std::numeric_limits!
  • @MarekR 仅当使用的浮点类型在这两个平台上具有不同的精度时,在这种情况下,这两个平台上已经有不同的结果。

标签: c++ decimal std cout stringstream


【解决方案1】:

值具有固定的精度,具体取决于类型,您无法更改它。它是实现定义的。您只能更改输出的精度,所有类型的浮点数只有一个设置。 float、double 和 long double 不能有不同的输出精度。所有浮点类型的默认输出精度为 6。

从技术上讲,不可能为例如设置不同的输出精度。 float 比例如double.

std::setprecision 没有重载。每个std::basic_ostream 只能保存一个精度值。

【讨论】:

  • cout 怎么会为所有十进制类型提供重载?
  • 我也注意到 std::to_string 也一样,有什么办法可以解决吗?
  • @MaximV std::setprecision 没有重载。每个std::basic_ostream 只能保存一个精度值。您可以编写自己的包装器。
【解决方案2】:

您可能想看看&lt;iomanip&gt; 库中的setprecision 函数。这将解决您的问题。通过调用此函数,您将能够为打印输出设置小数。检查以下示例:

#include <iostream>
#include <iomanip>
#include <limits>

using namespace std;

int main() {
    float a,b;
    cin>>a>>b;
    float c=a+b;
    cout<<fixed<<setprecision(1)<<c;// to print the decimal point scaled to 1

    return 0;
}

如果您仍有问题,请联系我。

【讨论】:

  • 为什么setprecision 在字符串流中的 c 之前应用?不应该是直接应用于 c 返回字符串的函数吗?
  • @MaximV 您是在寻找“为什么”的答案,还是只想知道如何打印更多数字?这个答案没有解释为什么所有三个都有一个设置,但你接受它表明它已经足够好了。
  • @MaximV setprecision 设置流的精度而不是值的精度。您无法更改值的精度。 “为什么在字符串流中的 c 之前应用 setprecision?” 没有字符串流。
  • @MaximV 它们将以相同的精度打印。您无法更改值的精度,并且每个流只能保持一个精度。 cout&lt;&lt;fixed&lt;&lt;setprecision(1)&lt;&lt;c; 不会改变 c 的精度。它改变了cout的精度。
  • @MaximV 在论坛或更多资源中寻找它可能会对您有所帮助。这就是它的使用方式。 [链接] (cplusplus.com/reference/iomanip/setprecision)。
猜你喜欢
  • 2014-02-07
  • 1970-01-01
  • 2018-02-23
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多