最近在做面试题,如下:

依次输入一个学生的学号,以及3科(C语言,数学,英语)成绩,在屏幕上输出该学生的学号,3科成绩。

输入描述:

学号以及3科成绩,学号和成绩之间用英文分号隔开,成绩之间用英文逗号隔开。

输出描述:

学号,3科成绩,输出格式详见输出样例。

示例1

输入

17140216;80.845,90.55,100.00

输出

The each subject score of  No. 17140216 is 80.85, 90.55, 100.00.

选择用python做的话:很容易就写出来如下代码:
s_input = input()
a,b = s_input.split(";")
s1,s2,s3 = b.split(",")
print("The each subject score of  No. %s is %.2f, %.2f, %.2f."%(a,round(float(s1),2),round(float(s2),2),round(float(s3),2)))

然后发现与题目要求的输出结果不一致,80.845四舍五入得到的是80.84

那如何能得到正确的四舍五入结果呢?

百度搜索之后,发现网上有说,写个函数,乘以一百,四舍五入之后,再除以一百,就能得到正确的四舍五入结果,尝试了一下,发现这个是坑,80.845四舍五入得到的是80.84,还是没办法返回80.85

继续百度,发现可以用 decimal 模块,设置rounding参数,指定进位方式为ROUND_HALF_EVEN 就可以得到正确的结果

于是自己写一个四舍五入的函数:

from decimal import Decimal, ROUND_HALF_UP
def rdec(x):
    return Decimal(x).quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)

这个函数的传参,建议用字符串,如果是浮点数的话,浮点值在计算机里面不能被精确存储,那么它会先被转换为一个不精确的二进制值,然后再把这个不精确的二进制值转换为等效的十进制值,这样得到的四舍五入的值肯定是有偏差的

然后这个面试题的答案如下:

from decimal import Decimal, ROUND_HALF_UP
def rd(x):
    return Decimal(x).quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
s_input = input()
a,b = s_input.split(";")
s1,s2,s3 = b.split(",")
print("The each subject score of  No. %s is %s, %s, %s."%(a,rd(s1),rd(s2),rd(s3)))