奇怪的圆形行为

Strange rounding behavior

本文关键字:      更新时间:2023-10-16

我正在尝试将双打打入特定的精度,但是以下功能给了我不同的结果:

版本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;
}

founding found number 300.9:

输出示例输出
  • 版本1:300.900000000003
  • 版本2:300.8999999999998

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

编辑:

我知道浮点精度的问题,这正是我要在这里避免的问题。我需要一种一致的方法才能四舍五入到小数点精度。

计算机的精度有限。您要么接受Double或Float的可用精度,要么寻求其他库,这些库可以使您获得足够的精度,但性能较差。实际上,您无法在计算机上实现精确的实数,甚至不需要它。double可以给您10^-16的相对精度,然后尝试长double。如果这还不够,请寻找可以为您做到这一点的外部库。这是任意精确库的示例。

从评论中,我看到您需要3个小数点的精度。如果您阅读此数字最多3个小数点,则两个结果都是相同的。我认为您感到困惑的原因是您不知道如何比较浮子。这是您的方式。

相关文章:
  • 没有找到相关文章