Python對小數進行四舍五入——解決使用round()函式四舍五入時的問題
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)
結果如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254943.html
標籤:python
