boost :: format提供与round不同的结果

Bin*_*ing 4 c++ math boost rounding

我想了解原因

double nbr = 102262.5;

boost::format("%.0f") % nbr;
Run Code Online (Sandbox Code Playgroud)

102262同时round(102262.5)102263.0

如果我们采取另一个示例值 34087.5

boost::format("%.0f") % nbr
Run Code Online (Sandbox Code Playgroud)

给出34088round(34087.5)给出相同的34088

这是否意味着圆形实现更复杂的算法以确保最接近的格式或printf不?

And*_* H. 7

有一种叫做"圆形半到均匀"或"圆形半到奇"的东西(链接).

这是减少舍入误差的偏差的规则,并且 boost::format似乎实现了这样的策略.基本上,这是以确定的方式(取决于数字本身)同等地经常上下打破平局案例(例如1.5或2.5).如果总是将这些案例全部整理或舍入,则可以通过舍入来引入统计偏差.后者是更为"经典"的舍入方式,似乎可以实现round.

注意,由boost::format(半周到偶数)实现的策略对应于IEEE 754标准中的默认舍入模式.