我想完全理解在C等旧语言中使用Money的最佳方式。我明白最好的方法是将钱存储为整数,因为钱实际上是一个整数,尽管我们以一种方式格式化它它看起来像小数点。例如,你现实生活中不可能有分数等等。
我想要做的是创建一个简单的示例程序,允许用户输入12.59。然后我会把它们给出的12.59输入,提取小数点并简单地存储一个int为1259.我该怎么做?
我的下一个问题是向用户显示结果。我如何获取1259的int并仅将其格式化为在整数的最后两个数字之间显示小数点?
答案 0 :(得分:1)
如何简单地将用户输入乘以100进行存储,然后在显示/使用时再将其除以100?
答案 1 :(得分:1)
逗号之前的部分是x / 100
(整数除,不是浮点),逗号之后的部分是x % 100
(确保x是正数):
unsigned x;
...
printf("%u,%02u", x / 100, x % 100);
答案 2 :(得分:1)
当读取浮点文本输入为2个整数时,需要采取一定的预防措施:范围,符号,额外空间,区分" .02"来自" .2"。一个挑战是确保没有空间,也没有在第二个数字(美分)之前签字。此外,如果领先(美元)金额为负数,则第二金额也是负数。
// 1: success, -1: EOF, 0: invalid input
int ReadCents(long long *amount) {
long long dollar;
int n;
char cent[3];
char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) return -1;
int count = sscanf(buf, "%lld.%2[0-9] %n", &dollar, cent, &n);
// all fields read?
// cent has 2 digits?
// no trailing junk?
if (count != 2 || cent[1] == '\0' || buf[n]) return 0;
*amount = dollar * 100 + ((dollar < 0) ? -1 : 1) * atoi(cent);
return 1;
}
可以为整数溢出添加测试。
打印出使用除法和余数。注意负数。
long long amount;
printf("%d.%02d", amount/100, abs(amount%100));
&#34;将货币存储为整数,因为货币实际上是一个整数&#34;过度简化了货币和数据表示的问题。在处理需要子整数精度的值时,使用浮点,整数或十进制浮点都有优点和缺点。当帖子查询如何读/写基于整数的解决方案时,上述答案解决了这个问题。