奇怪的舍入行为

时间:2017-02-28 09:24:54

标签: c++ visual-c++

我试图将双打精确到一个特定的精度,但是以下函数给出了不同的结果:

版本1:

static double RoundPrecision(double& val)
{
    val = floor(val * 1000 + 0.5) * 0.001;
    return val;
}

第2版:

static double RoundPrecision(double& val)
{
    val = floor(val * 1000 + 0.5) / 1000;
    return val;
}

舍入数字300.9时的输出示例:

  • 版本1:300.90000000000003
  • 第2版:300.89999999999998

两个版本有时会给出相同的结果,但对于特定输入,结果会有所不同。在将数字与程序中的其他变量等同时,我必须保持一致的行为。

编辑:

我知道浮点精度的问题,这正是我试图通过四舍五入避免的问题。我需要一种一致的方法来舍入到3个小数点精度。

1 个答案:

答案 0 :(得分:1)

计算机的精确度有限。您要么接受double或float中的可用精度,要么寻找其他能够提供足够精度但性能更差的库。实际上,你无法在计算机上实现精确的实数,甚至不需要它。 double给你10 ^ -16相对精度,然后尝试long double。如果这还不够,那么请寻找能够为您做到这一点的外部库。 Here's an example of an arbitrary precision library

从评论中我看到你需要3个小数位精度。如果您读取此数字最多3个小数点,则两个结果都相同。我认为你感到困惑的原因是你不知道如何比较花车。 Here's how you do it