不同的舍入结果表示在C ++中以5结尾的浮点数

时间:2018-03-11 21:18:33

标签: c++ rounding

我正在寻找一种方法来在今天早上用c ++舍入浮点数,我发现something that's being pitched解决了我的问题。

但是,我注意到一些不寻常的事情。当我尝试将某些浮点数舍入到两位小数时,似乎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.08
1.89
2.70
3.47

因此1.075变为1.08而1.895变为1.89。这让我很困惑。我会很感激一些解释。谢谢!

2 个答案:

答案 0 :(得分:1)

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

1.894999980926513671875

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

我设法使用this tool获得上述数字,这也可以用来解释其他值。

答案 1 :(得分:0)

大多数十进制数不能以二进制格式精确表示,因此必须进行舍入。 IEEE 754定义了此过程的几种可能性,我认为你看到了这个(来自Wikipedia的引用):

  

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

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