首先了解下round函式,很簡單,對浮點數進行近似取值,保留幾位小數
用法:
round(number,ndigits)
number:要四捨五入的數,ndigits:要小數點後保留的位數
在實際使用中發現round函式並不總是如上所說的四捨五入。如:
in [14]: round(2.355, 2)
out[14]: 2.35
py2.x和py3.x版本執行結果
>>> round(2.675, 2)
2.67
簡單的說就是,round(2.675, 2) 的結果,不論我們從python2還是3來看,結果都應該是2.68的,結果它偏偏是2.67,為什麼?這跟浮點數的精度有關。我們知道在機器中浮點數不一定能精確表達,因為換算成一串1和0後可能是無限位數的,機器已經做出了截斷處理。那麼在機器中儲存的2.675這個數字就比實際數字要小那麼一點點。這一點點就導致了它離2.67要更近一點點,所以保留兩位小數時就近似到了2.67。
由於round函式是四捨六入五平分的機制問題,所以想要得到傳統的四捨五入,使用round函式是不準確的,於是自己編寫了乙個函式
def
round_up
(number, ndigits=0)
:"""模擬round內建函式
此函式不再是四捨六入五平分的規則
如果ndigits=0時,根據內建round函式取整數,所以ndigits盡量不要使用預設值
例如 用number=1.3447543的例子,比如保留2位
保留2位時,要保證前3位的值不能變,因為要對第3位做判斷是否大於5,
但是直接取3位小數,那麼第4位的值會對第3位的值產生影響,比如:1.3447,保留3位會變成 1.345,對結果有影響,
所以直接保留4位,第四位的值怎麼變化都無所謂,因為我們不用,只用前3位
"""try:
if ndigits ==0:
# %.0f ---> 不保留小數,這種取值也會四捨六入五平分
res_3 = f"%.f"
% number
print
(res_3)
elif ndigits >0:
# 多保留2位number的小數 因為自帶的保留值是不準確的(%.2f) ---->相當於保留了4位
res_3 = f"%.f"
% number
print
(res_3)
# 1.3448
# 以"."分割開整數和小數,["1","3448"], 取小數字------>>>除以10之後取整得:344
res_2 =
int(
float
(res_3.split(
".")[-
1])/
10)# 得到餘數,後面根據餘數來判斷是否進1 344 % 10 = 4,其中商為34是保留的位數
res_1 = res_2 %
10# pow計算乘方(10的ndigits方)
# 得到保留位數的值,然後在判斷是否進"1"
last_res =
int(number)+(
int(res_2 /10)
)/pow(
10, ndigits)
if res_1 <5:
print
(last_res)
else
:# 保留的位數進「1」
last_res = last_res +1/
pow(
10, ndigits)
# 防止出現相加後得:1.324999999999999
print
(f"%.f"
% last_res)
except typeerror:
print
("輸入的內容不是數字"
)round_up(
2.675,2
)===>
2.68
print
(round
(2.675,2
))===
>
2.67
SQL的四捨五入ROUND函式
sql四捨五入2007 11 01 16 35問題1 select cast 123.456 as decimal 將會得到 123 小數點後面的將會被省略掉 如果希望得到小數點後面的兩位。則需要把上面的改為 select cast 123.456 as decimal 38,2 123.46 自動...
MS SQL的ROUND函式用來數值的四捨五入
ms sql的round函式用來數值的四捨五入 ms sql要進行數值的四捨五入,有一好用的函式round。語法 round numeric expression length function 引數numeric expression 精確數值或近似數值資料類別 bit 資料型別除外 的表示式。l...
oracle中round 四捨五入
語法 round函式 語法為round number,num digits 其中number是需要進行四捨五入的數字 num digits為指定的位數,按此位數進行四捨五入,如果num digits大於 0,則四捨五入到指定的小數字,如果num digits等於 0,則四捨五入到最接近的整數,如果n...