C语言一个四舍五入程序题目题目是输入一个double类型数,保留小数后两位,对第三位进行四舍五入.main(){double a,b;scanf("%lf",&a);b=(int)(a*100+0.5)/100.0;printf("%.2f",b);}我自己写的基本也是这样,验证发现
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/03 00:21:08
C语言一个四舍五入程序题目题目是输入一个double类型数,保留小数后两位,对第三位进行四舍五入.main(){double a,b;scanf("%lf",&a);b=(int)(a*100+0.5)/100.0;printf("%.2f",b);}我自己写的基本也是这样,验证发现
C语言一个四舍五入程序题目
题目是输入一个double类型数,保留小数后两位,对第三位进行四舍五入.
main()
{
double a,b;
scanf("%lf",&a);
b=(int)(a*100+0.5)/100.0;
printf("%.2f",b);
}
我自己写的基本也是这样,验证发现如果输入123.345或者说是XXX.XX5结果输出结果为123.34而不是123.35,求大神指教.
我发现 b=(int)(a*100+0.5)/100.0;
此句我分开打印验证,如果写成
b=a*100+0.5;
b=(int)(b);
b=b/100;
就是对的,(int)强制转换上面,即写成
b=(int)(a*100+0.5)
输入123.345,结果为12334而不是12335,为什么?
我是用的Borland C++选择C语言进行编译运行
我还发现一个奇怪问题,就是 b=(int)(a*100+0.5)/100.0;
最后必须写100.0而不是100,如果是100就会变成输入123.345,经过此步后就会变成123.00,但是如果是如下面我分开写
b=a*100+0.5;
b=(int)(b);
b=b/100;
就没有问题,这又是为什么?
C语言一个四舍五入程序题目题目是输入一个double类型数,保留小数后两位,对第三位进行四舍五入.main(){double a,b;scanf("%lf",&a);b=(int)(a*100+0.5)/100.0;printf("%.2f",b);}我自己写的基本也是这样,验证发现
以下仅为个人意见,不保证正确
我把楼主给的几种情况都反汇编了之后发现,
b=a*100+0.5;
b=(int)(b);
b=b/100;或b=b/100.0 两种结果一样
分开写时
.
80483fb:8b 45 e8 mov 0xffffffe8(%ebp),%eax
80483fe:50 push %eax
80483ff:db 04 24 fildl (%esp)
8048402:8d 64 24 04 lea 0x4(%esp),%esp
8048406:dd 5d f0 fstpl 0xfffffff0(%ebp)
b=b/100;
8048409:dd 45 f0 fldl 0xfffffff0(%ebp)
804840c:dd 05 20 85 04 08 fldl 0x8048520
8048412:de f9 fdivrp %st,%st(1)
8048414:dd 5d f0 fstpl 0xfffffff0(%ebp)
.
比b=(int)(c*100+0.5)/100.0;多了几个fstpl以浮点精度入栈和出栈操作,我们知道由于计算机对浮点数运算的能力比较差,所以可能在这种连续的运算中出了些比较小的出入,所以导致结果不一致.由于不同计算机对浮点数的运算能力不同,也解释了为什么不同机器结果不一样.
楼主补充的问题,第一种连在一起写,编译器直接解释为整形的运算了.