【问题标题】:Dividing a float by 10 [duplicate]将浮点数除以 10 [重复]
【发布时间】:2012-01-27 05:27:24
【问题描述】:

可能重复:
Why can't decimal numbers be represented exactly in binary?

我正在开发一个在 C++ 下使用的非常简单的数学算法。

而且我有一个名为“step”的浮点变量,每次我完成一个while循环,我需要将step除以10。

所以我的代码是这样的,

float step = 1;
while ( ... ){
      //the codes
      step /= 10;
}

在我愚蠢的简单逻辑中,结果很好。 step会被10除,从1到0.1,从0.1到0.01。

但它没有,而是出现了 0.100000000001 之类的东西。我就像“这到底是什么”

有人可以帮我解决这个问题吗?这可能与我不完全理解的数据类型本身有关。因此,如果有人可以进一步解释,将不胜感激。

【问题讨论】:

  • 你将它除以 1,而不是 10。
  • 这是一个很明显的打字错误。
  • Shane:请不要在此处重新输入内容。复制和粘贴。当人们发现他们花了 15 分钟调试一个从未存在的问题时,他们会感到非常沮丧和投反对票。 (好吧,感到沮丧和投反对票。其他人可能反应更好。)
  • 如果可以选择,您可以除以 2(或 8),这将为您提供更准确的值。

标签: c++ floating-point floating-accuracy inexact-arithmetic


【解决方案1】:

这是一个数字问题。问题是 1/10 在二进制中是一个无穷长的数字,连续应用除以 10 最终会在每个步骤中对误差求和。要获得更稳定的版本,您应该乘以除数。但请注意:结果也不准确!您可能想用双精度替换浮点数以最小化错误。

unsigned int div = 1;
while(...)
{
    double step = 1.0 / (double)div;
    ....
    div *= 10;
}

【讨论】:

  • div 也应该是浮点类型,否则你不会走得太远。
【解决方案2】:

对于二进制浮点运算,除以 10 并不准确,因此您看到的结果与您的预期有些不同。

二进制浮点表示为整数比率,其中分母是 2 的幂。由于没有二进制分数完全等于十分之一,因此您将看到最接近的可表示数字,而不是您预期的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多