我显然不知道如何设定精度。此代码应打印出通过收费站的汽车的价格
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;
}
然而,打印出来的是没有尾随零的“成本”。
答案 0 :(得分:1)
对于您的特定情况,它不会添加尾随零,因为cost
在您的代码中被声明为integer
。您需要将其强制转换为double
或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;
顺便说一下,您可能想阅读问题评论部分中给出的链接。
答案 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)
您可以使用setprecision
和showpoint
:
double a = 14;
cout << setprecision(4) << showpoint << a;
输出:
14.00
下行是你必须计算setprecision参数。