奇怪的圆形行为
Strange rounding behavior
我正在尝试将双打打入特定的精度,但是以下功能给了我不同的结果:
版本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个小数点,则两个结果都是相同的。我认为您感到困惑的原因是您不知道如何比较浮子。这是您的方式。
相关文章:
- 没有找到相关文章