C语言一个四舍五入程序题目题目是输入一个double类型数,保留小数后两位,对第三位进行四舍五入.main(){double a,b;scanf("%lf",&a);b=(int)(a*100+0.5)/100.0;printf("%.2f",b);}我自己写的基本也是这样,验证发现
来源:学生作业帮助网 编辑:作业帮 时间:2024/07/04 16:12:14
![C语言一个四舍五入程序题目题目是输入一个double类型数,保留小数后两位,对第三位进行四舍五入.main(){double a,b;scanf(](/uploads/image/z/10369795-67-5.jpg?t=C%E8%AF%AD%E8%A8%80%E4%B8%80%E4%B8%AA%E5%9B%9B%E8%88%8D%E4%BA%94%E5%85%A5%E7%A8%8B%E5%BA%8F%E9%A2%98%E7%9B%AE%E9%A2%98%E7%9B%AE%E6%98%AF%E8%BE%93%E5%85%A5%E4%B8%80%E4%B8%AAdouble%E7%B1%BB%E5%9E%8B%E6%95%B0%2C%E4%BF%9D%E7%95%99%E5%B0%8F%E6%95%B0%E5%90%8E%E4%B8%A4%E4%BD%8D%2C%E5%AF%B9%E7%AC%AC%E4%B8%89%E4%BD%8D%E8%BF%9B%E8%A1%8C%E5%9B%9B%E8%88%8D%E4%BA%94%E5%85%A5.main%28%29%7Bdouble+a%2Cb%3Bscanf%28%22%25lf%22%2C%26a%29%3Bb%3D%28int%29%28a%2A100%2B0.5%29%2F100.0%3Bprintf%28%22%25.2f%22%2Cb%29%3B%7D%E6%88%91%E8%87%AA%E5%B7%B1%E5%86%99%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%B9%9F%E6%98%AF%E8%BF%99%E6%A0%B7%2C%E9%AA%8C%E8%AF%81%E5%8F%91%E7%8E%B0)
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以浮点精度入栈和出栈操作,我们知道由于计算机对浮点数运算的能力比较差,所以可能在这种连续的运算中出了些比较小的出入,所以导致结果不一致.由于不同计算机对浮点数的运算能力不同,也解释了为什么不同机器结果不一样.
楼主补充的问题,第一种连在一起写,编译器直接解释为整形的运算了.