有人可以解释这种行为吗?我很清楚浮点数的机器级表示。这似乎与 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);
}
Output:
> 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 http://linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.html:
“对于 GNU C 库, printf() 使用的舍入规则是“银行家舍入”或“舍入到偶数”。这比其他一些 C 库更正确,因为 C99 规范规定转换为十进制应该使用当前的选择 IEEE 舍入模式(默认银行家舍入)。”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)