四舍五入函数返回错误的双估计

round function returns wrong double estimation

本文关键字:错误 函数 返回 四舍五入      更新时间:2023-10-16

我试图将双精度四舍五入到小数点后3位,但是…

double round_double(double d){
    return round(d * 1000) / 1000;
}
int main() {
    double r = round_double(1.5 * 1.001);
    cout << r << endl;
    return 0; }

当我运行它的结果是1.501…为什么它不返回1.502?另外,当我将round_double函数更改为如下所示:

return floor(d * 1000 + 0.5) / 1000;

仍然产生1.501…知道为什么吗?

因为1.5 * 1.001double中没有精确的表示。按1.5014999999999998处理

解决这个问题的一个很常见的方法是加(减)一些epsilon值。

带epsilon校正的舍入函数可能看起来像

double round_double(double d)
{
    const double epsilon = 10e-8;
    d = signbit(d) ? d - epsilon : d + epsilon;
    return round(d * 1000) / 1000;
}