有人可以解释这种行为吗?我很清楚 float 的机器级表示。这似乎与 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
注意,第一个数字向下取整,第二个数字向上取整。
最佳答案
它是“四舍五入”或“银行家四舍五入”。选择舍入表示的最后一位数字,即使该数字恰好介于两者之间。
http://linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.html :
“对于 GNU C 库,printf() 使用的舍入规则是“bankers rounding”或“round to even”。这比其他一些 C 库更正确,因为 C99 规范说转换为十进制应该使用当前选择 IEEE 舍入模式(默认银行家舍入)。"
关于c++ - double 的 printf 舍入行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10357192/