1

我是 C++ 新手,自学,我正在使用 Deitel 的“C++ 如何编程 - 第 7 版”一书。现在,请看下面的代码

    #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

4 回答 4

6

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

于 2012-08-09T14:27:43.950 回答
1

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

固定(cout);//而不是使用 << 或 >> 您将流传递给操纵器函数。

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

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

此外,可以在此处找到固定文档:

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

希望这可以帮助

于 2012-08-09T14:27:16.173 回答
0

如果您选择了更宽的精度,那么如果没有fixed.

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

然后你的输出看起来更像你的预期。(顺便说一句,您应该通过将赚取的利息折回本金来计算复利。)

否则,只有setprecision(2),格式化程序决定使用科学计数法,以便仅显示 2 位精度。

但是,由于您希望输出提供固定数量的数字,因此您提供的(fixedsetprecision(2))将做到这一点。

于 2012-08-09T14:39:46.447 回答
0

它不仅仅是 ascii 字母和数字

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

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

于 2012-08-09T14:28:06.053 回答