C语言四舍五入的问题???

#include <stdio.h>
#include <stdlib.h>
int main()
{
double a;
a=1.11111111111111224;
printf("%.16lf",a);
system("pause");
return 0;
}
为何输出为1.1111111111111123
四不是应该舍吗?

这不是四舍五入造成的,这里根本没有四舍五入的操作,即便是把a=1.11111111111111224
删除最后一位的4,且写成a=1.1111111111111122,也会得到1.1111111111111123的结果。这是因为,计算机中数是用二进制表示且有长度限制的,浮点数用“阶码+尾数原码”表示,double型用52位二进制原码来表示尾数,数字化表示对大多数数值来说是不精确的,在这里1.1111111111111122、1.11111111111111224等已经无法用最后一位是“1”是“0”来精确区分,采用“1”或“0”之一最接近的数是1.1111111111111123,所以才有了这个结果……
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-19
没能正确地做四舍五入是因为有效数字个数超出 double 允许范围,尾部数据不精确了。

有效数字少一点时,我的编译器(VC++ 6.0) 好像能做四舍五入。例如:
#include<stdio.h>
#include<stdlib.h>
main(){
double a,b,c,d;
a=1.12345;
b=-1.12345;
c=1.12344;
d=-1.12344;
printf("a=%.4lf b=%.4lf\n",a,b);
printf("c=%.4lf d=%.4lf\n",c,d);
a = 1.1234567890345;
b = -1.1234567890345;
c = 1.1234567890344;
d = -1.1234567890344;
printf("a=%.12lf b=%.12lf\n",a,b);
printf("c=%.12lf d=%.12lf\n",c,d);
return 0;
}
输出为:
a=1.1235 b=-1.1235
c=1.1234 d=-1.1234
a=1.123456789035 b=-1.123456789035
c=1.123456789034 d=-1.123456789034
====
编译器 是否总能正确地做四舍五入,没考证过。
通常,考虑数的正负,把某位绝对值加 5, 自己处理 四舍五入 为妥。本回答被提问者采纳
第2个回答  2013-09-18
double精度的问题,当小数长度大于16位的时候,后面的数字就不准确了。。这是计算机存储小数的限制。题主可以试试在a后边再增加几位,然后printf里边.16改成.17或者其他值,观察下结果就可以发现,打印出来的值都不是你预期的结果。四舍五入的话,参考lcyjlu的回答。
顺便提一下,double双精度,小数点后16位,float单精度,小数点后8位,超过这个位数的值不准确。
第3个回答  2013-09-18
这样写不是四舍五入,四舍五入要先乘 10的16次方 加0.5后取整 再除以 10的16次方
第4个回答  2013-09-18
因为你定义的a是double型 double是双精度浮点型 也就是所谓的实数 实数是有小数点的 如果不想要 那就定义int型变量 这样就没有小数点了