四舍五入到最接近的 uint64_t

Round double to nearest uint64_t

我需要将双精度四舍五入到最接近的有效值 uint64_t

所以

uint64_t Round(double);
Round(std::numeric_limits<double>::max())==std::numeric_limits<uint64_t>::max();
Round(std::numeric_limits<double>::lowest())==std::numeric_limits<uint64_t>::min();
Round(1.1)==1;

Round 应该等同于此,但对于 uint64_t 而不是带符号的积分

auto Round(double d){
    std::fesetround(FE_TONEAREST);
    return llrint(d);
}

std && boost 中是否有任何函数可以启用此功能?

A​​ double 无法保存 uint64_t 的所有值,因为两者通常都是 64 位,而 double 需要为指数预留位。

然而,获得最接近的值并不难:

uint64_t Round(double x){
    double rounded=round(x);
    if(rounded<0)
        return 0;
    if(rounded>=pow(2,64))
       return std::numeric_limits<uint64_t>::max();
    return static_cast<uint64_t>(rounded);
}