如何接受具有以小数点分隔的数字的用户输入并将该输入存储为不带小数点的int?

时间:2015-08-02 16:10:16

标签: c

我想完全理解在C等旧语言中使用Money的最佳方式。我明白最好的方法是将钱存储为整数,因为钱实际上是一个整数,尽管我们以一种方式格式化它它看起来像小数点。例如,你现实生活中不可能有分数等等。

我想要做的是创建一个简单的示例程序,允许用户输入12.59。然后我会把它们给出的12.59输入,提取小数点并简单地存储一个int为1259.我该怎么做?

我的下一个问题是向用户显示结果。我如何获取1259的int并仅将其格式化为在整数的最后两个数字之间显示小数点?

3 个答案:

答案 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;过度简化了货币和数据表示的问题。在处理需要子整数精度的值时,使用浮点,整数或十进制浮点都有优点和缺点。当帖子查询如何读/写基于整数的解决方案时,上述答案解决了这个问题。