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型变量 这样就没有小数点了

C语言四舍五入的问题???
没能正确地做四舍五入是因为有效数字个数超出 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 ...

c语言的四舍五入问题
C语言中一般不四舍五入,而是只考虑整数部分,如 int i,j;i=7\/5;(即1.4)j=9\/6;(即1.5)printf("%d %d",i,j);输出均为1

c语言的四舍五入问题
if(x>=0.5){b=a+1;printf("四舍五入后的结果为%d",b);} else{b=a-1;printf("四舍五入后的结果为%d",b);}} b没有正确赋值。

C语言的四舍五入问题
C\/C++中的“四舍五入”遵守的规则是“<5舍,否则入“。

c语言中的四舍五入怎么做?
incloud <stdio> int main(void){ float a ;scanf(“%f”,&a);a=(int)(a*1000+0.5)\/1000.0;printf (“%0.3f”,a);return 0;}

C语言四舍五入的问题
如果你想四舍五入,比方说,想要3.14159,四舍五入取小数点后3位,你可以将3.14159*1000,得到3141.59,然后再加上0.5,得到3142.09,然后再取整(强制转化为INT型),得到3142,然后再除以1000,就得到你想要的小数点后3位的四舍五入了,就是3.142.如果不想要四舍五入,直接截取,就不要加...

c语言中如何进行四舍五入,求详细解释!!谢谢!
总结四舍五入保留n为小数 (int)(x*10的n次方+0.5)*10的负n次方;其次这个方法对负数无效;如果非要用可以先取正数部分算,最后加上负号 } 方法二:使用round()函数。include"stdio.h"include"math.h"void main(){ float x;scanf("%f",&x);int y = round(x);printf("%d",y);} ...

c语言怎么四舍五入
C语言中四舍五入这样表示:inta=100.453627。printf("%.1f",a+0.05);\/\/四舍五入到十分位。printf("%.2f",a+0.005);\/\/四舍五入到百分位。以此类推,对于十进制小数.5类型数(如0.5,11.5,18.5),即小数部分可以以2的负一次方来表示的数,这时计算机是可以“完美”的储存这个十...

C语言中关于四舍五入的问题。
如果把s=((int)(s*10000+0.5))\/10000.0 去掉 再printf("%.4f",s);输入3.1415926 那么最后结果 是 3.1415 不会是3.1416 cpu没有四舍五入的功能 只能靠编程实现 s=((int)(s*10000+0.5))\/10000.0 就是 用啦对小数点后第4位实现四舍五入的 你可以验证一下 ...

C语言中的四舍五入问题
C语言规定 f若f前没有标注任何数字,编译系统输出默认小数点后有6位数 像%.4f,输出小数点后是4位数字 像%.8f,输出小数点后是8位数字 它之所有扩大1000倍,就是想要小数点后的两位数 四舍五入就像小学那种啊 大于5就往前移动1,本来那个归0 题目已经很清楚了 x[10]={15.6,19.9,16.7,15...

相似回答
大家正在搜