Python碎片日记11——少见的数字类型:小数、分数、布尔

除整数、浮点数、复数三大核心数字类型外,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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值