我是C语言自学者,请求先知解答下面这道题,谢谢!
设变量n为float类型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是()
A.n=(n*100+0.5)/100.0;
B.m=n*100+0.5,n=m/100.0;
C.n=n*100+0.5/100.0;
D.n=(n/100+0.5)*100.0;
问题:请将四个选项一一解析,有请大师!
补充:对不起,我想与你讨论下这个题。对于A,恰恰验证是可以的。#include<stdio.h>void main(){ float n=2.55; int m=5; n=(n*100+0.5)/100.0; printf("%.2f\n",n);}对于B,我认为直接不行,因为m取整,直接将0.5丢弃,这个应当是不可以吧。对于C,我不题解。还是验证吧。如下:#include<stdio.h>void main(){ float n=2.55; int m=5; n=n*100+0.5/100.0; printf("%.2f\n",n);}结果,它将后面的0.5/100.0丢弃成为255.00,没有进位。即255.005应当进位成255.01?最后看看D,还是验证来看吧。如下:#include<stdio.h>void main(){ float n=2.555; int m=5; n=(n/100+0.5)*100.0; printf("%.2f\n",n);}结果,n由52.555进位成52.56,最后输出52.56,似乎也符合要求。不知我这样理解是否正确。最佳答案
呵呵,解题不是为了答案,而是最简便地接触到问题实质的过程……实际工作中要求的高效往往使你忽略一些基本问题,所以思路要重于答案和技巧。
A.n=(n*100+0.5)/100.0;
B.m=n*100+0.5,n=m/100.0;
C.n=n*100+0.5/100.0;
D.n=(n/100+0.5)*100.0;
【A】
n=n*100;
//保留数全部归入整数、不保留数全部归入小数,这是一个数据整理过程,其实是分割出整数和小数两个数组;
n=n+0.5;
//小数数组中第一个数(原数第三位小数)进行四舍五入、并修改整数数组最后一位,达成题目要求的四舍五入;
n=n/100.0;
//将两个数组重新整合,整数数组的前两个数重新归入小数数组并修改整数数组,实现了数据格式还原,原数的小数点后三位都符合了题目的要求;
//但是!请注意,n是浮点数,小数点后第四位及以后的数字仍旧存在并保留(符合题意)。
【B】
n=n*100;
n=n+0.5;
//这与A相同;
m=n;
//这里与A的不同在于n的小数数组完全被舍弃了,但是整数数组则符合题意要求的保留二位小数并将第三位四舍五入;
//注意!题意并没有说原数中第四位及以后的小数是否要舍弃!因此还是应该保留原始数据!
//之后就省略了,此处已经可以判定A比B更合适。
【C】
其实就是考验运算符优先级,0.5/100.0根本无厘头。
【D】
位运算方向错误,n/100增加了小数,再加.5是将百位数去四舍五入了。
——所以答案应该是A,既达成了题目要求、又尽可能保存了完整的数据。
追答:追问中关于D的验证过程有个问题哟,不要用2.555这样暧昧的参数,用123.45678试试吧……
另,题目中说“第三位四舍五入”则第三位小数结果是0,之后的小数应该不变;故此,printf请不要用%lf.2来影响结果呀。
其他回答
其它网友回答:
答案选B,其他答案有错误
追问:
感谢你的耐心!就按你说的,如下: #include<stdio.h> void main() { float n=1.2; int m=5; n=(n/100+0.5)*100.0; printf("%lf\n",n); } 输出n=51.200000,改为printf("%.2f\n",n)输出,n=51.20 我用VC6.0测试,符合要求呀!我真是搞糊涂了。
其它网友回答:
答案选B
其它网友回答:
对ACD,由于n是float型,可以保留8位小数,所以对n所做的运算起不到舍弃后面小数的作用。
其它网友回答:
而B,由于m是int型,所以第一步运算会进行取整,由于加了0.5,所以会起到四舍五入的效果。
其它网友回答:
还不懂就追问,满意请采纳。码字不易。
追答:
你说的很对,上午看的不是很认真,B的那个0.5加的没有意义
追问:
这个题是大学的一道C语言选择题,它提供的答案是A。可是,通过验证D也可以呀,还是请你仔细研究下。为什么会出现这样的情况?
追答:
不不不,你看D项,如果n特别小,为1.2吧,进行运算的话,结果是51.200001 就不对了, 验证的话,要选大数,小数等各个方面都要考虑 不懂请追问! 满意请采纳!