C+中的舍入误差+;Visual Studio Express 2012 当我试图在C++中编写自己的舍入函数时,遇到了一个非常奇怪的功能。
以下两个函数都产生0.000作为输出C+中的舍入误差+;Visual Studio Express 2012 当我试图在C++中编写自己的舍入函数时,遇到了一个非常奇怪的功能。,c++,visual-studio-2012,C++,Visual Studio 2012,以下两个函数都产生0.000作为输出 double round ( double x, int y) { double value = 0; value = floor(x*pow(10, y) + x>=0?0.5:-0.5)/pow(10, y); return value; } double round3(double x) { double value = 0; value = floor(x * 1000 + x>=0?0.5
double round ( double x, int y)
{
double value = 0;
value = floor(x*pow(10, y) + x>=0?0.5:-0.5)/pow(10, y);
return value;
}
double round3(double x)
{
double value = 0;
value = floor(x * 1000 + x>=0?0.5:-0.5) / 1000;
return value;
}
但是,此函数生成正确的输出,四舍五入到小数点后3位
double round(double x)
{
double value = 0;
if (x >= 0){
value = floor( x*1000 + 0.5 )/1000;
}
else{
value = floor( x*1000 - 0.5 )/1000;
}
return value;
}
有人能告诉我为什么会发生这种情况吗?三元运算符
?:
的优先级很低,这是
x * 1000 + x>=0?0.5:-0.5
相当于:
(x * 1000 + x>=0)?0.5 :-0.5
结果是0.5
或-0.5
前两个都有错误,例如(x*1000+x>=0?0.5:-0.5)/1000
被评估为((x*1000+x)>=0)?0.5:-0.5)/1000
,当x
为正时为0.0005,当x
为负时为-0.0005
一定要记住双打的“四舍五入”是一件棘手的事情。。。通常在第15位或第16位附近会出现错误,这可能是因为您执行的操作的“数学上完美”结果无法在
双变量中准确表示,或者是因为中间值或数学函数(如pow
)中的近似值,因此,您可能会发现您认为是“n.5”的值有时向上舍入,有时向下舍入。如果对此感到困惑,请阅读。非常感谢。我会把它放在哪里?在括号中强制它按我预期的方式运行