四舍五入到最近的uint64_t

问题描述 投票:0回答:1

我需要将双精度取整为最接近的有效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;

该回合应与uint64_t等效,而不是带符号的整数

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

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

c++ floating-point rounding
1个回答
1
投票

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.