C++ 四舍五入到 FE_TONEAREST

C++ rounding to FE_TONEAREST

任何人都可以解释为什么将 0.5 舍入到 FE_TONEAREST 得到 0?结果不应该给'1吗?有办法"fix"吗?

#include <fenv.h>
#include <iostream>
#include <cmath>

int main() {
    fesetround(FE_TONEAREST);
    std::cout << "Rounding 0.5 to nearest = " << std::rint(0.5) << std::endl;
    return 0;
}

coliru 上的可运​​行代码:http://coliru.stacked-crooked.com/a/9c179ca56f251628

FE_TONEAREST 导致 std::rint 将中途情况 (±n.5) 舍入到最接近的 even 整数值。 0 是偶数。

如果您在此模式下改用 std::round,中途情况会 "up"(远离零),这将导致 1.

参见 documentation for std::rint

为什么 您可能希望这种不寻常的舍入形式是 explained over on Mathematica.SE。 (因此您的数据不会全部朝一个方向移动)。

顺便说一句,C++ 提供了标准头文件的正确包装版本,名称添加到 std 命名空间(尽管这在这里无关紧要):通常 #include <cfenv> 而不是 #include <fenv.h>.