为什么 std::cout 输出浮点数、双精度浮点数和长双精度浮点数时显示的小数位数相同?

3

直觉上我会认为 long double 比 double 有更多的小数位,double 比 float 有更多的小数位,但是,如果真是这样,为什么 std::cout 在输出时打印出浮点数(floats)、双精度浮点数(doubles)和长双精度浮点数(long doubles)时,它们的小数位数相同,即使它们有所有基本数据类型的重载?

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

1
所有浮点数类型只有一个设置。您不能为float、double和long double设置不同的精度。 - Thomas Sablik
3
@ThomasSablik那并不是标准委员会为什么选择那种方式的动机。 - Arthur Tacca
2
相关链接:https://stackoverflow.com/a/50970282/4641116 - Eljay
1
@MarekR 标准本可以轻松地指定一些“足够使表示在该精度下不含糊”的内容。这意味着库需要了解实现特定的细节,但这已经在std::numeric_limits中得到处理了。事实上,这种假设的实现甚至可以使用std::numeric_limits - Arthur Tacca
1
@MaximV 你真的对它为什么会这样感兴趣吗?这是你问的问题,但考虑到你接受的答案,似乎你真正感兴趣的是如何改变这种行为。 - Arthur Tacca
显示剩余5条评论
2个回答

3

根据类型确定了值的固定精度,您无法更改它。这是实现定义的。您只能更改输出的精度,并且所有类型的浮点数只有一个设置。您不能为float,double和long double具有不同的输出精度。所有类型的浮点数的默认输出精度为6。

在技术上不可能为例如float设置与double不同的输出精度。

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


为什么 cout 会为所有十进制类型提供重载? - MaximV
我还注意到std::to_string也是一样的,有什么解决办法吗? - MaximV
@MaximV std::setprecision没有重载版本。每个std::basic_ostream只能保持一个精度值。你可以编写自己的包装器(wrapper)。 - Thomas Sablik

0
你可能想要查看 <iomanip> 库中的 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?它不应该是直接应用于返回字符串的函数吗? - MaximV
2
@MaximV 你是在寻找一个“为什么”的答案,还是只想知道如何打印更多位数?这个答案并没有解释为什么所有三个选项都有一个单独的设置,但是你接受了它表明它已经足够好了。 - John Kugelman
2
@MaximV的setprecision设置流的精度而不是值的精度。您无法更改值的精度。 “为什么在字符串流之前应用setprecision?”没有字符串流。 - Thomas Sablik
@ThomasSablik如果在同一流中有多个具有不同精度的小数怎么办? - MaximV
1
@MaximV 它们将以相同的精度打印。 您无法更改值的精度,每个流只能容纳一个精度。 cout<<fixed<<setprecision(1)<<c; 不会更改 c 的精度。 它会更改 cout 的精度。 - Thomas Sablik
1
@MaximV 在论坛或其他来源上寻找可能会有所帮助。这就是它的使用方法。[链接] (https://www.cplusplus.com/reference/iomanip/setprecision/)。 - Liana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接