如何正确使用setprecision()将“.00”添加到金额结尾?

时间:2016-04-19 17:54:02

标签: c++ cout iomanip

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

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;
}

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

4 个答案:

答案 0 :(得分:1)

对于您的特定情况,它不会添加尾随零,因为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;

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

答案 1 :(得分:1)

请勿使用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; as I noted in a comment,IEEE 32位浮点数不具有表示整个int范围的精度(例如(1 << 24) + 1在转换为IEEE 32位1 << 24时等于float {{ 1}})。最好避免在没有必要时出现精确错误的风险。

答案 2 :(得分:1)

正如其他人写的那样,原因是你使用的是int而不是双打,但无论如何。你是否可以使用双打来代表货币,这有点争论。我不会这样做,但对于大多数非财务软件(如游戏,学校项目,跟踪你的月收入和开支),这已经足够了。

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

答案 3 :(得分:0)

您可以使用setprecisionshowpoint

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

输出:

14.00

下行是你必须计算setprecision参数。