printf双打的舍入行为

有人可以解释这种行为吗? 我很清楚浮点数的机器级表示。 这似乎与printf及其格式有关。 两个数字都用浮点表示法精确表示(检查:乘以64得到一个整数)。

#include  #include  using namespace std; int main() { double x1=108.765625; printf("%34.30f\n", x1); printf("%9.5f\n", x1); printf("%34.30f\n", x1*64); double x2=108.046875; printf("%34.30lf\n", x2); printf("%9.5f\n", x2); printf("%34.30f\n", x2*64); } 

输出:

 > 108.765625000000000000000000000000 > 108.76562 > 6961.000000000000000000000000000000 > 108.046875000000000000000000000000 > 108.04688 > 6915.000000000000000000000000000000 

请注意,第一个数字向下舍入,第二个数字向上舍入。

这是“一半到一半”或“银行家的四舍五入”。 圆形表示的最后一位数被选择为即使数字正好在两者之间。

http://linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.html
“对于GNU C库,printf()使用的舍入规则是”银行家舍入“或”舍入到偶数“。这比其他一些C库更正确,因为C99规范说转换为十进制应该使用当前选择IEEE舍入模式(默认银行家舍入)。“

%9.5f输出给出小数点后5位数,这是最接近源数的小数点。