天天看點

《Python Cookbook v3.0.0》Chapter3 數字、日期、時間

本文章節會嚴格按照原書(以便和原書對照,章節标題可能會略有修改),内容會有增删。

3.1 四舍五入(僞)

示例,

>>> round(3.321819,-2)
0.0
>>> round(353.321819,-2)
400.0
>>> round(353.321819,2)
353.32
>>> round(2.5)  //attention
2
>>> round(1.5)
2
>>> round(353.321819,-1)
350.0
>>> round(353.321819,4)
353.3218
>>> round(353.321819,3)
353.322
           
上面有一點(

attention位置

)需要注意,

2.5

并沒有四舍五入成

3

,而是

2

原因是,

5

這種情況,位于中間位置,

round

傳回離它最近的偶數

對于

浮點

的精度,大家都知道,cpu的浮點運算隻是近似,比如,

>>> a=1.1
>>> b=1.1
>>> a+b
2.2
>>> a=1.3
>>> a+b
2.4000000000000004
           
這時候,用

round

是可以去掉後面的誤差,但是沒有必要,

日常的運算(非金融領域),這點誤差不會有影響。

3.2 精确的浮點運算

from decimal import Decimal

直接看示例,

>>> a=Decimal('1.1')
>>> b=Decimal('1.3')
>>> a+b
Decimal('2.4')
>>> a+b==Decimal('2.4')
True
>>> ad=Decimal(1.1)
>>> bd=Decimal(1.3)
>>> ad+bd
Decimal('2.400000000000000133226762955')
>>> bd+ad==Decimal(2.4)
False
>>> Decimal(2.4)
Decimal('2.399999999999999911182158029987476766109466552734375')
           
是以,從例子也能看出,對于現代計算機,做不到真正的浮點,

Decimal

處理的其實是

字元串

,是以它的效率,比

float

運算低,

對于非金融領域的,沒有必要用

Decimal

對于精度,

Decimal

精度是準确的,
《Python Cookbook v3.0.0》Chapter3 數字、日期、時間
如果需要控制小數點後幾位,可以使用Decimal的

本地上下文 localcontext

from decimal import localcontext

>>> localcontext()
<decimal.ContextManager object at 0x0000000003A60170>
>>> with localcontext() as ctx:
...     ctx.prec = 3
...     print(a/b)
    
0.846
>>> with localcontext() as ctx:
...     ctx.prec = 10
...     print(a/b)
    
0.8461538462
           

3.3 數字的格式化輸出

format

,前文已有叙述,這裡補充幾個,

>>> format(x, '0,.1f')  //','是千位分隔符
'1,234.6'
>>> format(x, 'e')  //'e'是指數
'1.234568e+03'
>>> format(x, '0.2E')
'1.23E+03'
           

3.4 進制轉換

10 轉 其他進制,有

bin

oct

hex

format

其他進制 轉 10,有

int

>>> x = 1234
>>> bin(x)
'0b10011010010'
>>> oct(x)
'0o2322'
>>> hex(x)
'0x4d2'
>>> format(x, 'b')
'10011010010'
>>> format(x, 'o')
'2322'
>>> format(x, 'x')  //注意,format,16進制是‘x’,不是‘h’
'4d2'
>>> x = -1234
>>> format(x, 'b')
'-10011010010'
>>> format(2**32 + x, 'b')
'11111111111111111111101100101110'
>>> format((2<<32) + x, 'x')
'fffffb2e'
>>> int('4d2', 16)
1234
>>> int('10011010010', 2)
1234
           

3.5 位元組到大整數的打包與解包

[TODO]

3.6 複數的數學運算

3.7 無窮和NaN

>>> a=float('inf')
>>> b=float('-inf')
>>> -a==b
True
>>> import math
>>> math.isinf(a)
True
>>> math.isinf(b)
True
>>> c = float('nan')
>>> math.isnan(c)
True
           

3.8 分數運算

>>> a = Fraction(5, 4)
>>> b = Fraction(7, 16)
>>> a*b
Fraction(35, 64)
>>> c = a * b
>>> c.numerator
35
>>> c.denominator
64
>>> float(c)
0.546875
>>> c.limit_denominator(8)  //限制分母的最大值,不要懷疑,它傳回的結果是最接近原值的
Fraction(4, 7)
>>> c.limit_denominator(32)
Fraction(6, 11)
>>> x = 3.75
>>> Fraction(*x.as_integer_ratio())  //同Fraction(x)
Fraction(15, 4)