VS 2012 printf()的舍入行为

时间:2015-10-09 16:48:35

标签: c visual-studio-2012 rounding

Visual Studio 2012中的printf()函数(编译器版本17.00.61030 for x86)在使用十进制数字时使用从零开始的舍入。即,printf("%.0f%, 0.5)打印1。但是当涉及到实际打印十进制数字时,似乎它使用了一些类似IEEE的舍入,但只是到最近的不均匀。即,printf("%.1f%, 0.05)printf("%.1f%, 0.15)都打印1。我觉得这很奇怪而且不一致。

以下是一些代码:

#include <stdio.h>
int main(int, char**) {
   printf("0.5 -> %.0f\n", 0.5);
   printf("1.5 -> %.0f\n", 1.5);
   printf("-0.5 -> %.0f\n", -0.5);
   printf("-1.5 -> %.0f\n", -1.5);
   printf("0.05 -> %.1f\n", 0.05);
   printf("0.15 -> %.1f\n", 0.15);
   printf("0.25 -> %.1f\n", 0.25);
   printf("-0.05 -> %.1f\n", -0.05);
   printf("-0.15 -> %.1f\n", -0.15);
   printf("-0.25 -> %.1f\n", -0.25);
   return 0;
}

匹配输出:

 0.5 -> 1
 1.5 -> 2
 -0.5 -> -1
 -1.5 -> -2
 0.05 -> 0.1  
 0.15 -> 0.1  
 0.25 -> 0.3  
 -0.05 -> -0.1
 -0.15 -> -0.1
 -0.25 -> -0.3

我误解了什么吗?我会假设四舍五入到任何小数位,总是以相同的方式工作。

1 个答案:

答案 0 :(得分:2)

这可以归结为只有极少数数字可以精确浮点表示。

0.5可以是因为它是一个二元理性。同上0.25。

0.15不能和最接近的可用双倍低于此值。因此,你观察到的四舍五入。