我想了解原因
double nbr = 102262.5;
boost::format("%.0f") % nbr;
提供102262
而round(102262.5)
提供102263.0
如果我们采用另一个示例值34087.5
boost::format("%.0f") % nbr
给出34088
,round(34087.5)
给出相同的34088
这是否意味着圆形实现更复杂的算法以确保最接近的格式或printf不?
答案 0 :(得分:7)
有一种叫做“圆形半到均匀”或“圆形半到奇”的东西(link)。
这是减少舍入误差和偏差的规则
boost::format
似乎实施了这样的策略。
基本上,这是以确定的方式(取决于数字本身)同等地经常上下打破平局案例(例如1.5或2.5)。如果总是将这些案例全部整理或舍入,则可以通过舍入来引入统计偏差。
后者是更为“经典”的舍入方式,似乎是由round
实现的。
请注意,boost::format
实现的策略(舍入一半到偶数)对应于IEEE 754标准中的默认舍入模式。
答案 1 :(得分:0)
std::rint
,如果你的编译器支持C ++ 11(或更高版本)C ++标准,它可用
如果您使用支持调用C标准库函数的pre-C ++ 11编译器,则可以调用C标准库函数之一rintf
,rint
或{ {1}},具体取决于您使用的浮点类型。