0

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

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

4 回答 4

1

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

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

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

于 2016-04-19T18:03:31.990 回答
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正如我在评论中指出的那样,IEEE 32 位浮点数没有表示整个范围的精度int(例如,当转换为 IEEE 32 位时(1 << 24) + 1变得等于)。最好避免不必要时出现精度错误的风险。1 << 24float

于 2016-04-19T18:31:43.140 回答
1

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

然而,回到你的实际问题:如果你想格式化货币值,你可能想要使用std::put_money而不是普通的浮点格式。

于 2016-04-19T18:34:43.553 回答
0

您可以使用setprecisionshowpoint

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

输出:

14.00

缺点是您必须计算 setprecision 参数。

于 2016-04-19T19:04:28.143 回答