C++ 货币转换器尾随零

c++ currency converter trailing zeroes

本文关键字:转换器 货币 C++      更新时间:2023-10-16

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

这是代码:

#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,以防输入小数。我该怎么做?

不要使用浮点数来赚钱:你将在第 15 个有效数字上偏离; 当你用两位数换美分时,它并不是特别大。

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

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

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

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

这会将 rand 乘以 100,将其转换为整数类型,然后检查右边的两个数字是否都是零。

更好的解决方案

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

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

当然,在用户输入中阅读到很长的问题仍然存在,但我不是cin的专家。