c ++货币转换器尾随零

时间:2016-02-18 15:10:28

标签: c++

我刚刚开始编程并编写了一个货币转换器程序,需要精确到2位小数(使用double)但是我不喜欢尾随零但是用户应该仍然能够输入带有设置精度的小数,将其四舍五入到一个整体整数

以下是代码:

#include <iostream>
#include <iomanip>

using namespace std;

const double DOLLAR = 0.05917;
const double EUROS = 0.05681;

int main()
{
double rand;
double equivD;
double equivE;

cout << setprecision(2)<<fixed;

cout << " Enter Rand amount: ";
cin >> rand;

cout << rand << " Rand(s)= ";
equivD= (rand*DOLLAR);
cout << equivD<< " Dollar(s)\n ";

cout << rand << " Rand(s)= ";
equivE= (rand*EUROS);
cout << equivE<< " Euro(s)\n ";

return 0;

}

如果输入的值为1000,则输出为:

1000.00= 57.24 Dollars 
1000.00= answer

如果输入的整数没有小数,我想删除.00,但如果输入小数,仍然保留double。我该怎么做?

2 个答案:

答案 0 :(得分:4)

不要使用浮动点来赚钱:你将在第15位重要人物上离开;当你消耗两位数的分数时,它并不是特别大。

在您的情况下,当您想要显示计算值时,使用64位整数类型并以美分工作,调整格式。 (使用外汇汇率时,不要忘记正确回合)。

答案 1 :(得分:0)

如果你想为不同的情况设置不同的格式,我会测试是否有小数。

在您的示例中,使用 double ,这可能是

if( 0 == (((long long)(rand*100)) % 100) )
    cout << setprecision(0);

rand 乘以100,将其转换为整数类型,然后检查右两位是否均为零。

更好的解决方案

使用整数类型(如 int long long )将值存储为&#34;百分之一的rands&#34; (像Bathsheba建议的那样)。这减少了舍入误差。要测试小数和输出,只需使用模数,如下所示:

cout << (rand / 100);    // Integer division
if( 0 != (rand % 100) )  // Are there any amounts less than one rand?
    cout << '.' << (rand % 100);

当然,仍然存在将用户输入读入 long long 的问题,但我不是 cin 的专家。