C++ 货币转换器尾随零
c++ currency converter trailing zeroes
我刚开始编程并编写了一个货币转换器程序,该程序需要精确到小数点后 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的专家。
相关文章:
- 转换器练习:跳过 if 语句和 if 语句
- 使用转换器提升 Python 问题 - 静态链接
- 我写的 ASCII 到二进制转换器C++向后显示二进制,如何使其正确显示?
- 十进制到二进制转换器 c++
- 用于 boost::p roperty_tree 的通用枚举转换器
- 为什么我的C++基转换器中出现分段错误?
- 将字节数组转换为对象C++ |C++中的 C# 位转换器
- 英语到摩尔斯电码转换器
- 我用c++做了一个转换器,把英里转换成公里,把公里转换成英里,把赛尔修斯转换成法赫伦海特,把法赫伦海特转换成赛尔修斯
- 使用 Json 转换器反序列化 WCF 服务中的C++字符串
- 十进制,包括负到 32 位二进制转换器
- 标准::映射转换器模板
- 英里到千克转换器练习的小语法错误
- 句子转换器在存在新行的情况下不起作用
- 在C Windows程序中获取A/D转换器示例程序
- ROS中未定义的参考误差到OpenCV图像转换器
- 表达式到C++类类型转换器/类型转换
- 这里怎么了?单位转换器
- C++ 货币转换器尾随零
- C++ -- 如何使用开关语句和恒量获得有效的货币转换器