【C语言速成】5. 实战演练:不四舍五入地保留小数点后两位

引言

在输出小数时可以用printf("%.2f", 变量名);非常方便地保留小数点后两位,但是这种操作有一个自动四舍五入的环节不能避免。比如有一个float类型变量a的值是9.876,printf("%.2f", a);输出的结果是9.88而不是9.87,因为printf函数会自动进行四舍五入。这篇文章会讲解如何通过前面文章里学过的操作保留小数点后两位而不进行四舍五入。

程序设计要求

设计一个程序,读取一个小数,不进行四舍五入地保留小数点后两位之后输出。

示例输入:

192.869326

示例输出:

192.86

思路

"%.2f"对变量进行四舍五入的环节是不可避免的,但是可以通过把小数点后两位以后的数设置为0来避免小数点后第三位大于等于5导致进位。

第一步

首先需要一个变量来保存输入的数据。这里就可以创建一个float型变量a,用scanf读取输入,存进a里。
enter image description here

第二步

想办法把a小数点后两位以后的部分砍掉。前边提到过,小数类型转换成整数类型时会直接砍掉小数点后的部分,但是程序设计要求保留小数点后两位,怎么办?
可以把小数点往后挪两位,这样小数点后的第一位跟第二位就跑到整数部分了,再转换成整数就不怕被砍掉了。怎么把小数点往后挪两位?让a乘100即可。之后创建一个int型变量b,用a*100的运算结果给它赋值。
enter image description here

第三步

该把小数点挪回去之后输出了,同理可得让小数点往左挪两位只需要对数除以100。
输出语句怎么写?是不是printf("%.2f\n", b / 100);?这样写是错的,因为b的类型是int,是整数类型,除以100以后还是整数类型,小数点后的部分又会被直接砍掉,最后结果仍然是个整数,更别提用%.2f对应了。正确做法是先把b强制转换成能表示小数的float类型,然后除以100再输出。所以正确的输出语句应该写为:printf("%.2f\n", (float)b / 100);
enter image description here

结尾

现在程序的代码已经写完了,可以编译程序和测试了。用示例输入测试一下,运行程序,输入192.869326以后摁回车就可以发现程序输出是192.86,没有因为小数点后第三位是9而导致小数点后第二位进位。至此本篇文章的程序设计要求就被完美的满足了。
enter image description here

标签