【问题标题】:How do I multiply this in C?我如何在C中乘以这个?
【发布时间】:2014-01-25 10:07:13
【问题描述】:

我正在编写一个程序,它从用户那里获取以美元为单位的输入,并将其转换为 int,即美分。 用户将始终输入整数或浮点数,最多保留 2 位小数。我想通过乘以 100 将其转换为 int。但是该程序不适用于某些数字。

int cents = (dollars*100);

dollars 是用户给出的浮点输入。例如,如果 I dollars = 4.2,则 cents 变为 419.999。我该如何解决这个问题?

【问题讨论】:

  • 使用long cents 之类的大整数类型来存储整个总数(例如,14000.99 美元是 1400099 美分),并且在打印时只需明确打印美元和美分。例如。 long cents = 1400099; printf("You've got $%ld.%02ld\n", cents/100, cents%100);

标签: c precision multiplication


【解决方案1】:

你无法纠正它。浮点数没有“小数位”。它们总是近似的和模糊的。永远不要使用浮点数来赚钱——这是处理任何金融事物的软件最重要的规则之一。将输入读取为字符串 (%s),然后通过找到字符串中的小数点,然后在 . 之前和之后的部分上使用 atoi 将美分放在一起

【讨论】:

  • +1 同意。但在实践中,我从未见过有人在保险业中使用双倍以外的任何东西进行计算。在我的公司,这甚至是书面要求。这导致了所有的问题......
  • @Axel 你为什么不使用专门的类来处理金钱,而只是使用 that 来处理金钱的要求。这叫做关注点分离
  • 要求使用机器双精度数据类型。实现一个像 double 一样做所有事情的专用类只会引入开销。
  • 人们问为什么 COBOL 仍然存在。这正是 COBOL(过去在保险行业中无处不在)所擅长的东西。我想知道编写贵公司要求的人是否不明白他们在公司更改语言时从 PIC 说明符(即固定十进制)转移到双精度时放弃了什么。
【解决方案2】:

像这样简单地调整值:

int cents = (int)(dollars*100 + 0.5);

【讨论】:

  • 为什么要随意加0.5?你想让银行赔钱吗
【解决方案3】:
cents = (int)((dollars*100) + .5);

【讨论】:

    【解决方案4】:

    1) 您可以在项目属性中调整浮点精度模型
    2) 当从 float 转换为 int 时,添加一点以允许向下舍入总是很方便的:

    int cents = ((dollars*100.0)+0.5);
    

    【讨论】:

      猜你喜欢
      • 2010-10-06
      • 2019-03-03
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多