四舍五入函数返回错误的双估计
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…为什么它不返回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;
}
相关文章:
- 链接器错误:函数的多个定义
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 错误:函数声明符之后的预期函数体
- C 错误 - 函数不能超载
- 如何修复传递参数时调用错误函数的主函数?(C++)
- 错误:函数调用中有两个参数
- 错误:函数不是“类”的静态数据成员 - C++
- C ,G 编译错误函数
- CMake 解析错误函数缺少结尾")"。而是找到带有文本的未终止字符串")
- C++ 错误 函数 2 的多重定义
- 错误:函数调用中从int到int(*)[4]的转换无效
- C++14 自动扣除错误:函数返回一个数组
- 视觉C++错误:函数必须返回一个值
- 错误:函数声明中的两种或多种数据类型
- 错误:函数未在作用域中声明
- rtw_android.c错误:函数“strnicmp”的隐式声明[-Weror=隐式函数声明]
- 错误:函数中的return语句没有值,返回“void*”[-fpermission]
- 简单程序中的链接器错误:函数的多重定义
- 错误:函数参数太多
- 错误:函数__tmaincrtstartup中引用的未解析的外部符号_main