详解Python中的各种数字类型

2017-02-21 董付国 Python小屋 Python小屋

(1)  内置的整数、实数与复数

在使用中,不必担心数值的大小问题,Python支持任意大的数字,具体可以大到什么程度仅受内存大小的限制。由于精度的问题,对于实数运算可能会有一定的误差,应尽量避免在实数之间直接进行相等性测试,而是应该以二者之差的绝对值是否足够小作为两个实数是否相等的依据。在数字的算术运算表达式求值时会进行隐式的类型转换,如果存在复数则都变成复数,如果没有复数但是有实数就都变成实数,如果都是整数则不进行类型转换。


>>> 9999 ** 99 #这里**是幂乘运算符,等价于内置函数pow()

990148353526723487602263124753282625570559528895791057324326529121794837894053513464422176826916433932586924386677766244032001623756821400432975051208820204980098735552703841362304669970510691243800218202840374329378800694920309791954185117798434329591212159106298699938669908067573374724331208942425544893910910073205049031656789220889560732962926226305865706593594917896276756396848514900989999

>>> 0.3 + 0.2  #实数相加

0.5

>>> 0.4 - 0.1  #实数相减,结果稍微有点偏差

0.30000000000000004

>>> 0.4 - 0.1 == 0.3 #应尽量避免直接比较两个实数是否相等

False

>>> abs(0.4-0.1 - 0.3) < 1e-6 #这里1e-6表示10的-6次方

True


Python内置支持复数类型及其运算,并且形式与数学上的复数完全一致。例如:


>>> x = 3 + 4j   #使用j或J表示复数虚部

>>> y = 5 + 6j

>>> x + y  #支持复数之间的加、减、乘、除以及幂乘等运算

(8+10j)

>>> x * y

(-9+38j)

>>> abs(x)  #内置函数abs()可用来计算复数的模

5.0

>>> x.imag  #虚部

4.0

>>> x.real   #实部

3.0

>>> x.conjugate()   #共轭复数

(3-4j)


Python 3.6.x开始支持在数字中间位置使用单个下划线作为分隔来提高数字的可读性,类似于数学上使用逗号作为千位分隔符。在Python数字中单个下划线可以出现在中间任意位置,但不能出现开头和结尾位置,也不能使用多个连续的下划线。


>>> 1_000_000

1000000

>>> 1_2_3_4

1234

>>> 1_2 + 3_4j

(12+34j)

>>> 1_2.3_45

12.345


(2)分数

Python标准库fractions中的Fraction对象支持分数运算,还提供了用于计算最大公约数的gcd()函数和高精度实数Decimal,这里重点介绍Fraction对象。


>>> from fractions import Fraction

>>> x = Fraction(3, 5) #创建分数对象

>>> y = Fraction(3, 7)

>>> x

Fraction(3, 5)

>>> x ** 2   #幂运算

Fraction(9, 25)

>>> x.numerator  #查看分子

3

>>> x.denominator  #查看分母

5

>>> x + y  #分数之间的四则运算,自动进行通分

Fraction(36, 35)

>>> x * y

Fraction(9, 35)

>>> x / y

Fraction(7, 5)

>>> x - y

Fraction(6, 35)

>>> x * 2  #分数与数字之间的运算

Fraction(6, 5)

>>> Fraction(3.5)  #把实数转换为分数

Fraction(7, 2)


(3)高精度实数

标准库fractions和decimal中提供的Decimal类实现了更高精度的运算。


>>> from fractions import Decimal

>>> 1 / 9  #内置的实数类型

0.1111111111111111

>>> Decimal(1/9)   #高精度实数

Decimal('0.111111111111111104943205418749130330979824066162109375')

>>> 1 / 3

0.3333333333333333

>>> Decimal(1/3)

Decimal('0.333333333333333314829616256247390992939472198486328125')

>>> Decimal(1/9) + Decimal(1/3)

Decimal('0.4444444444444444197728216750')