Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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+中以5结尾的浮点数方面,不同的舍入结果+; 今天早上我在寻找C++中的浮点数方法,我发现了我的问题。_C++_Rounding - Fatal编程技术网

在C+中以5结尾的浮点数方面,不同的舍入结果+; 今天早上我在寻找C++中的浮点数方法,我发现了我的问题。

在C+中以5结尾的浮点数方面,不同的舍入结果+; 今天早上我在寻找C++中的浮点数方法,我发现了我的问题。,c++,rounding,C++,Rounding,然而,我注意到一些不寻常的事情。当我尝试将某些浮点数四舍五入到小数点后两位时,像1.075和1.895这样的数字似乎遵循不同的四舍五入规则。具体来说,使用以下简单代码: #include <iostream> #include <iomanip> int main(int argc, char** argv) { float testme[] = { 1.07500, 1.89500, 2.70500, 3.47500}; std::cout <&

然而,我注意到一些不寻常的事情。当我尝试将某些浮点数四舍五入到小数点后两位时,像1.075和1.895这样的数字似乎遵循不同的四舍五入规则。具体来说,使用以下简单代码:

#include <iostream>
#include <iomanip>

int main(int argc, char** argv)
{
    float testme[] = { 1.07500, 1.89500, 2.70500, 3.47500};
    std::cout << std::setprecision(2) << std::fixed;

    for(int i = 0; i < 4; ++i)
    {
       std::cout << testme[i] << std::endl;
    }

    return 0;
}

因此,1.075变为1.08,而1.895变为1.89。这真把我弄糊涂了。我希望你能解释一下。谢谢

我认为这是一个浮点数无法精确表示数字1.895的问题。计算机可以存储的最接近1.895的浮点值实际上是

1.894999980926513671875
如果四舍五入到小数点后两位,实际上应该是1.89,因为在查看下一个数字后,您会向下四舍五入


我设法用这个方法得到了上面的数字,这可能对解释其他值也很有用。

大多数十进制数字不能用二进制格式精确表示,所以它们必须四舍五入。IEEE 754定义了该程序的几种可能性,我想您可以看到这一种(引用自):

四舍五入到最近值,与偶数关联–四舍五入到最近值;如果数字中途下降,则使用偶数(零)最低有效位四舍五入到最接近的值;这是二进制浮点的默认值,也是十进制的推荐默认值


基本上,以数字5结尾的十进制数字有时向上舍入,有时向下舍入,以避免统计漂移。

打印更多字符,更好地了解1.075和1.895是如何表示的:这些数字可能无法用二进制精确表示,因此您永远不会有这些数字。因此,舍入会受到相应的影响。您没有对数字进行舍入。std::setprecision(2)不舍入任何内容。如果要对数字进行四舍五入,则应使用type
double
而不是
float
std::round
或类似方法。密切相关:遗憾的是,将大小增加到
double
还不够好:而且数字更多:
1.894999980926513671875