本文章節會嚴格按照原書(以便和原書對照,章節标題可能會略有修改),内容會有增删。
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)