【问题标题】:Sum Float number c++ [duplicate]和浮点数c ++ [重复]
【发布时间】:2012-10-27 18:48:25
【问题描述】:

可能重复:
Floating point error in representation?

这段代码有问题

int cent;
int dollar ;
float cnt2dlr;
 //convert cnt to doloar ;
cnt2dlr=(cnt)/(100);

问题在于cnt = 175cnt2dlr = 0.17,444444 而不是0.17,5

有什么帮助吗?

【问题讨论】:

  • 关于这个问题,你的昵称很有趣:)
  • 我觉得奇怪的是它偏离了这么多......
  • 一美元有 100 美分,而不是 1000。还要确保执行浮点除法。 175/1000 在 c 中是 0,而 175/1000.00.175(可能会出现浮点表示错误)。
  • 你确定那不是 0.17499999?那么这将是四舍五入/表示错误,因为浮点算术不是真正的算术。

标签: c++ floating-point c++builder


【解决方案1】:

浮点数通常不精确。您对此无能为力。

您的代码很好地说明了为什么不应该使用浮点数进行涉及金钱的计算。仅仅因为货币值有小数点,就可以将货币变成浮点数。浮点数应该用于变化无穷小的数量,例如温度或速度,而不是用于块状变化的数量,例如货币。

【讨论】:

  • 但是 32 位浮点数仍然比这更精确......我觉得奇怪的是它偏离了这么多。
  • @CookieOfFortune 非常正确,但它不是发布的真实代码,所以谁能说。如果他真的通过除以 1000 将美分转换为美元,那么他的程序还有其他问题。
  • 不同意你的观点,但是 32 位浮点数的 24 位精度意味着这个数字应该非常接近:2936013/2 ^ 24 = 0.17500001192
【解决方案2】:

浮点数不是精确的表示。它们是近似值,因此您无法保证很高的精度。阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

要提高数字的精度,请考虑使用 64 位 double 而不是 32 位 float

【讨论】:

    【解决方案3】:

    我有点疑惑。如果你的意思是 (cent) 而不是 (cnt),那么

    cnt2dlr=(cent)/(1000);
    

    (注意 e 分)是一个 int / int 除法,175 / 1000 应该返回 int 0。

    如果你这样做,你会得到相同的结果吗,例如

    cnt2dlr=(cent)/(1000.0);
    

    注意小数点。

    【讨论】:

      猜你喜欢
      • 2013-09-13
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 2012-01-20
      • 2021-09-16
      • 2011-02-23
      相关资源
      最近更新 更多