为什么需要同时使用 fixed 和 showpoint 操纵器来显示小数点和尾随零,而只有 fixed 才能完成这项工作?

Why do you need to use both fixed and showpoint manipulators to show decimal point and trailing zeros when only fixed does the job?

我了解 fixedshowpoint 操纵器各自的作用,但您为什么要同时使用它们? DS Malik 的 C++ 编程教科书是这样说的:

Of course, the following statement sets the output of a floating-point number in a fixed decimal format with the decimal point and trailing zeros on the standard output device:
cout << fixed << showpoint;

但是 fixed 不单独将输出设置为“带小数点和尾随零的固定十进制格式”吗?

我尝试了运行我自己的实验:

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
    cout << setprecision(3);
    cout << "only fixed" << "\t" << "fixed + showpoint" << endl;
    for (double i = 0.000001; i <= 100000; i *= 10) {
        cout << fixed     << i << "\t\t";
        cout << showpoint << i << endl;
        cout.unsetf(ios::fixed);     
        cout.unsetf(ios::showpoint);
    }
}

但我看不出只使用 fixed 和同时使用 fixedshowpoint 之间的区别,按顺序:

only fixed      fixed + showpoint
0.000           0.000
0.000           0.000
0.000           0.000
0.001           0.001
0.010           0.010
0.100           0.100
1.000           1.000
10.000          10.000
100.000         100.000
1000.000                1000.000
10000.000               10000.000
100000.000              100000.000

任何见解将不胜感激!

fixed you set a number of decimals that you want to see in all cases. So you will always see the decimal point. Combining with showpoint没有区别,除非...

除非...您 setprecision(0),在这种情况下您将永远看不到小数,因此没有小数点。在这种情况下,showpoint 将具有显示尾随小数点分隔符且后面没有任何内容的效果:

               0                  0.
               1                  1.
              10                 10.
             100                100.

现在,这个组合有用吗?我怀疑这是有道理的。所以,不,没有理由将这两者结合起来。

在您的情况下,showpoint 标志没有任何作用。由于所有打印输出的小数点后都有 3 位数字,并且显示了小数点。但在某些情况下,这两个标志会给出不同的结果。例如,如果您在代码中设置精度(0)。固定的情况下不显示小数点。

    cout << setprecision(0);

打印出来:

      only fixed   fixed + showpoint
               0                  0.
               0                  0.
               0                  0.
               0                  0.
               0                  0.
               0                  0.
               1                  1.
              10                 10.
             100                100.
            1000               1000.
           10000              10000.
          100000             100000.