printf双打的舍入行为

时间:2012-04-27 20:10:03

标签: c++ c double printf rounding

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

#include <stdio.h>
#include <iostream>
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

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

2 个答案:

答案 0 :(得分:18)

它的一半甚至是#34;或者&#34;银行家的四舍五入&#34;。圆形表示的最后一位数字被选择为即使数字正好在两者之间。

http://linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.html
&#34;对于GNU C库,printf()使用的舍入规则是&#34;银行家四舍五入&#34;或者&#34;围绕甚至&#34;。这比其他一些C库更正确,因为C99规范说转换为十进制应该使用当前选择的IEEE舍入模式(默认银行家舍入)。&#34;

答案 1 :(得分:0)

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