除整数、浮点数、复数三大核心数字类型外,Python还有一些不常用的数字类型:
小数
需要导入decimal模块。小数对象就像是浮点数,但是有固定的位数和小数点,即有固定精度。
对于普通浮点数,由于存储数值的空间有限,是缺乏精确性的。对于以下例子:
0.1 + 0.1 + 0.1 - 0.3 #输出结果为5.551115123125783e-17
输出结果并不为0,存在一定缺陷。如果改用小数对象,结果就能改正:
from decimal import Decimal
Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3') #结果为Decimal('0.0')
此外,该块还具有许多功能,对于处理小数数字时,会比单纯浮点数更加灵活,一定程度上避免精度造成的问题。(手动设置精度请见博文《Python碎片日记08》)
小数上下文管理器
用于重新设置临时精度。当with语句退出后,精度又重新设置为初始值。
import decimal
print(decimal.Decimal('1.00') / decimal.Decimal('3.00')) #输出结果0.3333333333333333333333333333
with decimal.localcontext() as ctx:
ctx.prec = 2
print(decimal.Decimal('1.00') / decimal.Decimal('3.00'))#输出结果0.33
print(decimal.Decimal('1.00') / decimal.Decimal('3.00'))#输出结果0.3333333333333333333333333333
分数
from fractions import Fraction
f = Fraction(2,3) #2/3分数
f + f #+-*/等运算结果也是分数
# 三种将小数转换为分数的方法:
Fraction('1.25') #5/4分数
Fraction.from_float(1.75) #Fraction(7, 4)
Fraction(*(1.75).as_integer_ratio()) #Fraction(7, 4)
同样,分数也能修正浮点数精度带来的问题,并能自动化简:
from fractions import Fraction
Fraction('0.1') + Fraction('0.1') + Fraction('0.1') - Fraction('0.3') #结果为Fraction(0, 1)
- Fraction + int ->Fraction
- Fraction + float ->float
- Fraction + Fraction ->Fraction
无论分数还是小数,变量值用交互式查看都会用Decimal(‘0.0’)、Fraction(0, 1)此类表示,而打印的结果则直接0.0,0,3/4比较用户友好的形式。
限制最大分母
由于float往往并不精确,转换分数很有可能仍不精确,限制最大分母有利于估计精确值。
from fractions import Fraction
(4.0/3).as_integer_ratio() #结果为(6004799503160661, 4503599627370496),损失了精度
a = Fraction(*(4.0/3).as_integer_ratio()) #结果是Fraction(6004799503160661, 4503599627370496)
a.limit_denominator(10) #限制分母最大为10,此语句返回结果为Fraction(4, 3),但是a本身并没有改变
布尔
以面向对象的观点看,True和False是int的子类,只是在显示方面不再是1和0。但是True与1、False与0并不是同一个对象,因此使用is判断时会返回False。