删除“固定”流操纵器时出现问题

时间:2012-08-09 14:18:45

标签: c++ stream

我是C ++的新手,我自己学习,我正在使用Deitel的“C ++ how to program - 7th edition”这本书。现在,请查看以下代码

    #include <iostream>
    #include <iomanip>
    #include <cmath>

    using namespace std;

    int main()
    {
        double principle = 1000;
        double amount;
        double rate = 0.05;

        cout << "Year" << setw(21) << "Amount on deposit" << endl;

        cout << fixed << setprecision(2);

        for(int years=1; years<=10; years++)
        {
            amount = principle * pow(1.0+rate,1.0);

            cout << setw(4) << years << setw(21) << amount << endl;
        }
}

当我删除“固定”流操纵器时,输出变为愚蠢,这意味着,只是ascii字母和数字。当我插入它时,输出没有任何问题。我的问题是,为什么会发生这种情况?对于具有“双”型输出的所有程序,“固定”是强制性的吗?请帮忙。

另一件事。什么是流操纵器?作为Java开发人员,我认为这些可能是某种常量变量,但事实并非如此!他们是方法吗?那为什么括号不在那里?请回答这个问题。

由于

4 个答案:

答案 0 :(得分:6)

输出不会“变得愚蠢”:您只需让输出流选择浮点数的格式,并选择科学记数法。这会为您1e+03(代表1*10^3)而不是1050.00fixed的使用告诉流你不需要科学记数法;你也可以使用scientific来强制科学格式。由于精确的格式取决于您的应用程序要求,因此使用fixedscientific的选择最终取决于您。

答案 1 :(得分:1)

像fixed这样的操纵器是函数,但是如果你想要它的common()那么它会是这样的:

固定的(COUT); //而不是使用&lt;&lt;或&gt;&gt;你将流传递给操纵器函数。

有关操纵器的更多信息,请参阅此参考资料:

http://www.cplusplus.com/reference/iostream/manipulators/

此外,可以在此处找到修复文档:

http://www.cplusplus.com/reference/iostream/manipulators/fixed/

希望这有帮助

答案 2 :(得分:0)

这不仅仅是ascii字母和数字

1e + 03是1 * 10 ^ 3的科学写作,即1000

供参考: http://www.cplusplus.com/reference/iostream/manipulators/fixed/

答案 3 :(得分:0)

如果您选择了更宽的精度,那么在没有fixed的情况下输出会有所不同。

        cout << setprecision(6); // 6 instead of 2

然后你的输出看起来更像你的期望。 (顺便提一下,你应该通过将获得的利息折叠回原则来计算复利。)

否则,只有setprecision(2),格式化程序决定使用科学记数法才能显示2位数的精度。

但是,由于您希望输出提供固定数量的数字,因此您提供的内容(fixedsetprecision(2))都会这样做。