我正在学习 setw 和 set precision 函数,所以这是我到目前为止一直在尝试的,我有几个问题。

#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;

它们输出相同的值,那么fixed到底改变了什么?

2) setw 如何处理负数?

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

213565552.0
213565552.0
213565552.0
213565552.0

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

3) 是否.数字算作 1 位吗?

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

前面有 6 个空格,后面有 1.23(因为点算作 1)。真的吗?

4)为什么set precision与setw一起使用?不使用的话为什么会出现0000呢?它是否出现了浮点数可以处理的尽可能多的 0?

5) 为什么x的值是

213565552.000
 213565552.000
  213565552.000
213565552.000

如果 x = 213565544.4826。

数字 44.4826 在哪里丢失了?

有帮助吗?

解决方案

这似乎是 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 的地方)。您可能想看看 每个计算机科学家都应该了解的浮点运算知识.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top