c++ 使用浮点型或双精度型时小数不显示

qvsjd97n  于 2023-05-30  发布在  其他
关注(0)|答案(4)|浏览(353)

我的代码是这样的:

#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”美元。这是为什么呢?

bf1o4zei

bf1o4zei1#

由于您正在处理美元金额,因此可以在写入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;
}
t1qtbnec

t1qtbnec2#

标准库已经有了一些处理货币值的代码。在C98/03中,使用起来很痛苦,可能不值得麻烦,但在C11中,添加了几个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”(小数点后有或没有一些0),它会将值打印为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等,以显示小数点后两位等。

zpjtge22

zpjtge223#

如果不格式化输出,cout将删除不必要的零。您可以设置输出的精度。

cout<<fixed<<setprecision(2)<<dollar<<endl;
des4xlb0

des4xlb04#

//cout << setprecision(3)<<固定;
还有一点:不要将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;
}

相关问题