round 函数 returns 错误的双重估计
round function returns wrong double estimation
我正在尝试将双精度四舍五入到小数点后 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... 为什么 return 不是 1.502?此外,当我将 round_double 函数更改为如下所示时:
return floor(d * 1000 + 0.5) / 1000;
它仍然产生 1.501... 知道为什么吗?
因为 1.5 * 1.001
在 double
中没有准确的表示。它被视为 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;
}
我正在尝试将双精度四舍五入到小数点后 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... 为什么 return 不是 1.502?此外,当我将 round_double 函数更改为如下所示时:
return floor(d * 1000 + 0.5) / 1000;
它仍然产生 1.501... 知道为什么吗?
因为 1.5 * 1.001
在 double
中没有准确的表示。它被视为 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;
}