python的math库中math.ceil(x)函数是向上取整,math.floor(x)函数是向下取整,round(x)是四舍五入,但是如下情况下round(x)函数会出现如下问题:
例如:
对1.25保留一位小数进行四舍五入的值应该是1.3,而round()函数的结果却是1.2,我们发现如果要保留的那一位小数的后一位是5的话,使用round()函数进行四舍五入,如果保留到的那位小数是偶数的话不进一,如果是奇数则进一。
解决这个问题方法如下:
自定义一个函数解决round不能进行严格的四舍五入的问题(适用于要求对小数进行严格的四舍五入的地方)
代码如下:
#思路:
#1.判断该小数是正数还是负数,如果是正数,输出下列计算的结果,如果是负数,输出下列计算结果的相反数,-1.25四舍五入结果为-1.3, 1.25四舍五入结果为1.3,所以一对绝对值相同的正负数,四舍五入的结果也是-对相反数,所以先将输入的参数取绝对值,对绝对值按下列方式计算后,如果输入参数是正数,结果即为对该绝对计算得到的数,如果输入参数是负数,结果即为对该绝对值计算得到的数的相反数。
#2.先让这个小数的绝对值乘以10^ (y+1) ,y+1为保留小数位数加一,再取计算这一步计算后结果的整数部分,例如小数x=1.251保留1位,第一步计算后结果为125.1,再取整数部分记为a,即a=125。
#3.让a/10,b1为a/10的整数部分b1=12, b2为a/10的小数部分,b2=0.5
#4.将b2的值与0.4比较,因为b2扩大10倍后的值便是要保留小数点后指定位数的下一位的数,例如将1.251保留小数点后一位,我们要看1.251小数点后一位的下一位即第二位的数,将它与4比较,如果比四小不进一,如果比四大进一。
#5.在上一步的判断结果中,如果b2 > 0.4,则进一,即b1+1,否则,b1值不变,将b1在这一步后的值记为c。
#6.将c除以10^y,y为保留小数的位数,并将该值记为d。
#7.如果输入参数是正数,精确四舍五入后的结果是d,如果输入参数是负数,精确四舍五入的结果是-d。
def Y(x,y):
xx=abs(x)
a=int(xx*10**(y+1))
b1=int(a/10)
b2=a/10-int(a/10)
if b2 > 0.4:
c=b1+1
else:
c=b1
d=c/10**y
#例如2.01保留三位小数应为2.010,python中print(2.010)的结果是2.01
#f1='%'+'.'+str(y)+'f'是定义输出的格式,避免将结果末尾的0不显示出来。
#print('%.3f' %2.010)输出的结果是2.010
f1='%'+'.'+str(y)+'f'
if x>0:
print(f1 %d)
else:
print(f1 %-d)
实例验证:
Y(1.5885,3)
Y(-1.25,1)
Y(1.281,0)
Y(1.5,0)