Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的舍入误差+;Visual Studio Express 2012 当我试图在C++中编写自己的舍入函数时,遇到了一个非常奇怪的功能。_C++_Visual Studio 2012 - Fatal编程技术网

C+中的舍入误差+;Visual Studio Express 2012 当我试图在C++中编写自己的舍入函数时,遇到了一个非常奇怪的功能。

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

以下两个函数都产生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:-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”的值有时向上舍入,有时向下舍入。如果对此感到困惑,请阅读。

非常感谢。我会把它放在哪里?在括号中强制它按我预期的方式运行