如何正确使用 setprecision() 将".00"添加到金额的末尾?

How do I properly use setprecision() to add ".00" to the end of an amount for money?

本文关键字:金额 添加 setprecision 何正确      更新时间:2023-10-16

我显然不知道如何设置精度。这个代码应该打印出通过收费站的汽车的价格

void TollBooth::arrive(Car c)
{
  carcount += 1;
  int cost;
  int doors = c.getDoors();
  cost = 3 + doors;
  total+=cost;
  cout << setw(12) << left << "Car: "<< setw(8) <<c.getID()<< setw(8) 
    << "  Amount Due: $ " << setw(5) << fixed << right << setprecision(2) << cost << endl;
}

然而,打印出来的是没有尾随零的"成本"。

不要使用setprecision,只需直接回显后面的.00(并调整前面的setw):

void TollBooth::arrive(Car c)
{
    carcount += 1;
    int doors = c.getDoors();
    int cost = 3 + doors;
    total += cost;
    cout << setw(12) << left << "Car: "<< setw(8) <<c.getID()<< setw(8) << "  Amount Due: $ " 
    << setw(3) << right << cost << ".00" << endl;
}

您可以强制转换为浮点,对于int值,在我所知的所有体系结构上使用double应该是安全的。不过不要转换为float;正如我在评论中指出的,IEEE 32位浮点不具有表示int的整个范围的精度(例如,当转换为IEEE 32位float时,(1 << 24) + 1变得等于1 << 24)。最好避免在不必要时出现精度错误的风险。

对于您的特殊情况,它不添加尾随零,因为cost在您的代码中被声明为integer。您需要将其强制转换为doublefloat(尽管这可能会导致某些整数值的数据丢失)。

cout << setw(12) << left << "Car: "<< setw(8) <<c.getID()<< setw(8) << "  Amount Due: $ " 
<< setw(5) << fixed << right << setprecision(2) << static_cast<double>cost << endl;

顺便说一句,你可能想阅读问题评论部分给出的链接。

正如其他人所写,原因是您使用的是int而不是double,但无论如何。是否可以用双精度来表示货币还有待商榷。我不会这么做,但对于大多数非金融软件(如游戏、学校项目、跟踪每月收入和支出)来说,这已经足够了。

然而,回到您的实际问题:如果您想格式化货币值,您可能希望使用std::put_money而不是纯浮点格式。

您可以使用setprecisionshowpoint:

double a = 14;
cout << setprecision(4) << showpoint << a;

输出:

14.00

不利的一面是,您必须计算setprecision参数。