在C++中逼近零的最佳方法是什么?

8

我有些难以清晰地表达,但它相当简单。

我的C++程序中有一个名为"double named value"的值,如果它是正值,我想将其向下取整;如果它是负值,则向上取整。精度由外部变量给出。

一个例子:

精度为1000, 值为0.2659,所以近似值为0.265; 值为-0.2659,所以近似值为-0.265.

我写了一段简单的代码,但我想知道是否有更简单和更好的方法。

这是我目前的代码:

void NodeImpl::approximation(double& value, const double& precision)
{
    if (value > 0.0)
    {
        value = std::floor(value * precision);
    }
    else
    {
        value = std::ceil(value * precision);
    }
    value /= precision;
}

我写了一段简单的代码,但是我想知道是否有更简单或更好的方法来实现它。


2
看起来没问题,但请注意最终的“value”可能会在小数点后第15位之后有一些玩笑数字,例如“0.265”实际上是“0.26500000000000001332267629550187848508358001708984375”。顺便问一下,为什么你要通过const引用传递“precision”? - Bathsheba
2
请注意,您打算执行的操作可能无法“精确”执行:例如,数字0.265没有有限的浮点表示,因此您不能在代码中依赖任何精确性。 - Walter
1
@LightnessRacesinOrbit:哦,我会享受这个的。 - Bathsheba
3
考虑到引用通常实现为指针,你仍然传递了64位数据,这也恰好是“double”类型的常见大小。简而言之,没有任何收益。通常来说,对于原始类型(如int、double等),如果不需要在函数内修改值,则不要通过引用进行传递。 - Some programmer dude
1
“避免复制操作可以使代码更易于理解,也可能更容易优化。当你处理较大的数据类型时,避免复制操作所带来的好处是值得的,但否则你只是为了不必要的复杂性而让事情变得“更加困难/复杂”。” - Lightness Races in Orbit
显示剩余4条评论
1个回答

9
您可以使用 std::trunc函数:
return std::trunc(value * precision) / precision;

@user463035818,它返回最接近参数的整数,但不大于其绝对值,即向零舍入。 - eerorika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接