使用Float或Double类型时,小数不显示。

4
我的代码是这样的:
#include <iostream>

int main()
{
    using namespace std;

    const float dollar = 1.00;

    cout << "You have " << dollar*10.00 << " dollars." << endl;

    cin.get();
    cin.get();

    return 0;
}

我是C++的初学者。我只是随便打了这段代码,以为控制台会显示“你有10.00美元”,但实际上它显示的是我有“10”而不是“10.00”美元。这是为什么?

4个回答

5

由于你处理的是美元金额,因此在写入cout之前可以设置以下内容:

std::cout.precision(2);
std::cout.setf(std::ios::fixed);

Live code example at coliru

#include <iostream>

int main() {
    using namespace std;
    const float dollar = 1.00;
    std::cout.precision(2);
    std::cout.setf(std::ios::fixed);
    cout << "You have " << dollar*10.00 << " dollars." << endl;
    cin.get();
    cin.get();
    return 0;
}

这很棒,完美地工作;但是,我不知道如何在程序中稍后更改精度。如果我不再需要显示小数点,我该怎么做? - Jake2k13
2
调用 std::cout.unsetf(std::ios::fixed) - user425495

2

标准库已经有一些处理货币值的代码。在C++98/03中,使用起来非常痛苦,可能不值得麻烦,但是在C++11中,添加了一些I/O操作符,使它们变得非常容易使用。

在默认的“C”语言环境中,它们可能没有太多用处,但在本地化的语言环境中,它们将按照该语言环境通常期望的方式格式化货币。例如:

#include <iostream>
#include <iomanip>

int main(){
    long double amt;

    std::cin.imbue(std::locale(""));
    std::cout.imbue(std::locale(""));

    std::cin >> std::get_money(amt);
    std::cout << std::put_money(amt) << "\n";
}

这里使用的是""语言环境,它根据操作系统配置选择语言环境。例如,在我的情况下,操作系统配置为美国英语,因此选择了美国英语环境。
基于环境的不同,这将根据该环境通常显示货币的方式来显示货币(程序员猜测)。例如,如果我输入“10” (小数点后带或不带零),它会以 10.00 的形式打印出来。
如果我愿意,可以指定一个特定的语言环境 - 例如,我可以指定“de”以获取德语环境。在这种情况下,值将(至少使用我手头可用的编译器)使用德国约定打印出来(点作为千位分隔符,逗号作为小数点分隔符)。还要注意,我可以将std::cin的语言环境与std::cout的语言环境分别指定,因此我可以(例如)将cin设置为美国英语,将cout设置为德语。如果我这样做,可以输入1,234,567.89作为输入,并获得1.234.567,89作为输出。(请注意,虽然它会将格式从美国约定转换为德国约定,但它不会自动将我输入的美元货币转换为欧元货币输出)。
请注意,put_money还会在完成操作后自动恢复以前的格式。例如,如果我将上面的最后一行更改为:std::cout << std::put_money(amt) << "\n";,然后将10作为输入,则得到10.00 10
此外,请注意(至少在VC++中),std::get_money实际上将值存储为美分的整数计数,这将防止大多数舍入误差。因此,如果我输入10,实际上存储的是1000,然后重新缩放为输出时显示为10.00
如果你使用较旧的编译器,不包括std::get_moneystd::put_money,最简单的方法可能是从标准库中复制它们的定义,将它们放入自己的头文件中,并仍要使用它们。如果您不想这样做,可以考虑定义一个money类来存储金额,并重载operator>> 和 (特别是)operator<< 来处理所需的格式,这样写出货币数值将变得非常简单。
money m(10);

std::cout << m;

...而且operator<<会处理所有的std::setprecision等内容,以在小数点后显示两位数字。


1
如果您不对输出进行格式化,cout 将裁剪掉不必要的零。您可以设置输出的精度。
cout<<fixed<<setprecision(2)<<dollar<<endl;

我必须逐行进行这个操作吗?还是有某种范围可以应用于整个代码块。 - Jake2k13

1

//cout << setprecision(3) << fixed;

还有一个要点:不要将using namespace std;放在main语句内部,

添加头文件#include <iomanip>

代码

int main()
{
    float dollar = 2.00f;


    cout << setprecision(3) << fixed;
    std::cout  << dollar << " dollars." << endl;

    cin.get();
    cin.get();

    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接