python比較靠譜的保留小數方法

2022-09-05 14:57:12 字數 1557 閱讀 7992

最近遇到乙個神奇的問題:

>>> round(0.215,2)

0.21

>>>

而我想要的結果是0.22,這個應該是二進位制儲存的原因。那麼如何避免呢?

找了半天找到乙個辦法,貼在此處記錄下:

import

decimal

>>> aa = decimal.decimal('

0.215')

>>> aa.quantize(decimal.decimal('

1.00'))

decimal(

'0.22')

>>>

貌似好點了,繼續實驗下:

>>> from decimal import

decimal

>>> decimal('

0.125

').quantize(decimal('

1.00'))

decimal(

'0.12')

>>> decimal('

0.375

').quantize(decimal('

1.00'))

decimal(

'0.38

')

又有點兒意外了,原來quantize還有乙個引數rounding,表示進製方式,預設值為round_half_even,此時精確小數點是如果遇到5,會是遵循前一位數字的奇進偶舍,

奇進偶舍簡單解釋:

例如對於乙個小數a.bcd,需要精確到小數點後兩位,那麼就要看小數點後第三位:

如果d小於 5,直接捨去

如果d大於 5,直接進製

如果d等於 5:d後面沒有資料,且 c 為偶數,那麼不進製,保留 c

d後面沒有資料,且 c 為奇數,那麼進製,c 變成(c + 1)

如果d後面還有非 0 數字,例如實際上小數為a.bcdef,此時一定要進製,c 變成(c + 1)

那麼我們需要在quantize中指定進製方式為round_half_up

from decimal import *

>>> decimal('

0.125

').quantize(decimal('

1.00

'), rounding=round_half_up)

decimal(

'0.13')

>>> decimal('

0.385

').quantize(decimal('

1.00

'), rounding=round_half_up)

decimal(

'0.39')

>>>

參考:

靠譜的數字

數字從1開始,遇到數字7就會跳過,比如6後邊直接是8,69後邊直接是80,現在給你個數字,問是第幾位?見文末 比如輸入8,輸出7,就是第7個數。87 用時 0天0小時0分鐘0秒1毫秒 8870 用時 0天0小時0分鐘0秒2毫秒 888637 用時 0天0小時0分鐘0秒3毫秒 8888 5740 用時...

Python保留小數的方法

因總是忘記保留小數的方法,故在此做個總結。方法一 字串格式化 print 2f 1.255 1.25方法二 format函式方法 format函式有兩種寫法 1 使用佔位符 需注意佔位符和冒號不能丟 此方法可以一次輸出多個 print format 1.256,1.2635 1.26,1.2642 ...

看書學python靠譜嗎 自學Python靠譜嗎?

自學python首先要比培訓班學習來得經濟又實惠,需要的是充足的時間,一般培訓機構費用都是一萬多的學費,自學python可以說是0費用就能入門。自學python可以分為以下三個階段 第一 基礎語法學習。python的基礎語法包括兩大部分,其一是函式式程式設計部分,其二是物件導向程式設計部分。函式式部...