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

时间:2017-09-08 13:51:18

标签: c++ math boost rounding

我想了解原因

double nbr = 102262.5;

boost::format("%.0f") % nbr;

提供102262round(102262.5)提供102263.0

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

boost::format("%.0f") % nbr

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

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

2 个答案:

答案 0 :(得分:7)

有一种叫做“圆形半到均匀”或“圆形半到奇”的东西(link)。

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

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

答案 1 :(得分:0)

顺便说一下,如果你想在不依赖Boost的情况下在C ++中进行舍入一半甚至行为,你可以调用C ++标准库函数std::rint,如果你的编译器支持C ++ 11(或更高版本)C ++标准,它可用

如果您使用支持调用C标准库函数的pre-C ++ 11编译器,则可以调用C标准库函数之一rintfrint或{ {1}},具体取决于您使用的浮点类型。