0

我正在学习 setw 和 setprecision 函数,所以这是我迄今为止一直在尝试的,我有几个问题。

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    float y = 1.25;

    cout << fixed << setw(10) << setprecision(2) << y << endl;

    cout << "\n\n\nx\n";

    float x = 213565544.4826;
    cout << fixed << setw(13) << setprecision(3) << x << endl;
    cout << fixed << setw(14) << setprecision(3) << x << endl;
    cout << fixed << setw(15) << setprecision(3) << x << endl;
    cout << fixed << setprecision(3) << x;

    cout << "\n\n\nz\n";

    float z = 213565544.4826;
    cout << setw(11) << setprecision(1) << x << endl;
    cout << fixed << setw(12) << setprecision(1) << x << endl;
    cout << fixed << setw(11) << setprecision(1) << x << endl;
    cout << setw(12) << setprecision(1) << x << endl;

    cout << "\n\n\nm\n";

    float m = -344.275;
    cout << fixed << setprecision(1) << x << endl;
    cout << fixed << setw(8) << setprecision(1) << x << endl;
    cout << fixed << setw(7) << setprecision(1) << x << endl;
    cout << fixed << setw(6) << setprecision(1) << x << endl;

    return 0;
}

输入是:

      1.25



x
213565552.000
 213565552.000
  213565552.000
213565552.000


z
213565552.0
 213565552.0
213565552.0
 213565552.0



m
213565552.0
213565552.0
213565552.0
213565552.0

所以,现在我的问题是:

1)为什么我们首先使用“固定”?

如果我们看这个例子:

cout << setw(11) << setprecision(1) << x << endl;
cout << fixed << setw(11) << setprecision(1) << x << endl;

它们输出相同的值,那么固定真正改变了什么?

2) setw 如何处理负数?

在 m 的最后一个例子中。所有示例的结果都是相同的, setw 中的 - 符号有什么变化?

213565552.0
213565552.0
213565552.0
213565552.0

这些数字从何而来?m 的值与输出的值完全不同。

3) 是否。在数算为 1 位?

例如,我们有数字 1.23 和 setw(10)

之前会有 6 个空格,然后是 1.23(因为点被计为 1)。真的吗?

4) 为什么 setprecision 和 setw 一起使用?为什么不使用时会出现0000?它是否出现了浮动可以处理的尽可能多的 0?

5) 为什么 x 的值

213565552.000
 213565552.000
  213565552.000
213565552.000

如果 x = 213565544.4826。

数字 44.4826 在哪里丢失?

4

1 回答 1

3

这些似乎是 5 个问题,而不是 1 个。反正:

  1. std::fixed用于表示您总是希望有一个定点格式,而不是在这种表示法更合适的地方使用科学计数法。当需要多个数字来合理表示该值时,格式将切换使用x.yyyyyyEee(您可以要求始终使用科学格式使用std::scientific)。
  2. std::setw()不在乎格式化什么值!当一个值被格式化并且有一个正数out.width()集时,输出将被填充out.fill()字符至少为out.width()字符宽。如果输出大于out.width()反正,则不会发生填充。在每次输出操作 [考虑out.width()在内] 后,out.width()将重置为0(所有其他格式化选项不会自动重置)。
  3. 任何字符都计入宽度,包括符号、千位分隔符、小数点等。小数点不计入精度:out.precision()是小数位数(用于std::fixed格式化)或非指数位数(用于std::scientific格式化) )。
  4. 宽度是输出将填充多少个字符,精度指定要产生多少[小数]位。
  5. 二进制浮点值可以表示很少的十进制数字(因为float它通常是 6;您可以使用 找出可以安全使用的数字std::numeric_limits<float>::digits10)。尝试使用比这更多的数字可能会在处理十进制值时导致意外输出(在处理二进制值时,您可能对最多std:numeric_limits<float>::digits位置感兴趣)。你可能想看看每个计算机科学家应该知道的关于浮点运算的知识
于 2013-11-07T19:23:11.680 回答