C++四舍五入到FE_TONERAEST
C++ rounding to FE_TONEAREST
有人能解释一下为什么0.5
到FE_TONEAREST
四舍五入会得到0
吗?结果不应该是"1"吗?有办法"解决"这个问题吗?
#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
)四舍五入到最接近的偶数整数值。CCD_ 7是偶数。
如果您将std::round
与此模式一起使用,则一半的情况将"向上"取整(远离零),这将导致1
。
参见std::rint
的文档。
为什么你可能想要这种不寻常的舍入形式,Mathematica.SE上已经解释过了。(这样你的数据就不会全部向一个方向移动)。
顺便说一句,C++提供了标准头的正确包装版本,并将名称添加到std
命名空间中(尽管这在这里并不重要):这通常是#include <cfenv>
而不是#include <fenv.h>
。