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
我误解了什么吗?我会假设四舍五入到任何小数位,总是以相同的方式工作。
答案 0 :(得分:2)
这可以归结为只有极少数数字可以精确浮点表示。
0.5可以是因为它是一个二元理性。同上0.25。
0.15不能和最接近的可用双倍低于此值。因此,你观察到的四舍五入。