跳转至

2.4.Number

Windows 10
Python 3.7.3 @ MSC v.1915 64 bit (AMD64)
Latest build date 2020.11.21

Python 只有三种数值类型:整数、浮点数、复数。

整数

numbers.Integral 描述了数学上的整数集(正数和负数)。

Python 有 2 种整数类型:

  • 数值型整数 numbers.Integralint 类型实现了该抽象接口。数值型整数的表示范围在语言上是无限制的,只受限于计算机的内存(虚拟内存)。对于以移位和屏蔽运算,数值型正数被认为是二进制的形式,如果是负数,那么就被转换成二进制补码形式,符号位向左扩展。

  • 布尔型整数 bool。布尔类型是int的子类型,分别用数值 0 和 1 来表示假和真,但是当返回值的类型是字符时,其分别用 "False" 或者 “True” 表示。

返回该整数对应的二进制形式所需要的位数

int_num = 10
int_num.bit_length
<function int.bit_length()>

浮点数

浮点数 numbers.Real 表示机器级的双精度浮点数,float 类型实现了该抽象接口。其表示范围和溢出处理受限于 机器体系结构 和 编译器/解释器 的具体实现。

Python 不支持单精度浮点数,使用它的原因通常是减少CPU负荷和节省内存,但这些节省的开销与在 Python 中使用对象的开销相比要小得多,因此没有必要支持两种浮点数使语言变得复杂。

关于运行程序的机器的浮点数的精度和内部表示的信息可以在 sys.float_info 中找到。

float_num = 10.5

获取浮点数的十六进制表示。

float_num.hex()
'0x1.5000000000000p+3'

该浮点数是否为整数。

float_num.is_integer()
float_num.as_integer_ratio()
(21, 2)

从十六进制小数的字符串创建浮点数。

float.fromhex('0x1.ffffp10')
2047.984375

返回一对整数,其比率等于该浮点数,分子永远为正整数,如果原浮点数为 NaN,将引发 OverflowError

float_num = -10.5
float_num.as_integer_ratio()
(-21, 2)

复数

复数 numbers.Complex 描述了一对机器级的双精度浮点数,complex 类型实现了该抽象接口。复数 z 的实部和虚部可以通过属性 z.realz.imag 获得。

Python 完全支持数值类型的混合计算。当不同数值类型的操作数被用于计算时,表示范围小的操作数将被扩大到另一个操作数的类型。其中,整数比浮点数范围窄,浮点数比复数窄。

complex_num = 10 + 5j

获取共轭复数

complex_num.conjugate()
(10-5j)

获取 实部 和 虚部

# tag = "input"
print(complex_num.real)
print(complex_num.imag)
10.0
5.0

进制数表示

在 Python 中,整数可以使用二进制、八进制、十六进制表示,默认使用十进制形式。浮点数的整数部分及小数部分都只能使用十进制表示。

0b0B 开头表示二进制数:

0b10
2

可以使用bin函数获取一个10进制数值的二进制形式。bin函数返回的是数值的二进制形式的字符串,而不是数字。

bin(2)
'0b10'

0o0O 开头表示八进制数:

0o10
8

可以使用oct函数获取10进制整数的8进制整数形式:

oct(8)
'0o10'

0x0X 开头表示十六进制数:

0x10
16

科学记数法

eE 表示 exponent(指数)。

0e0 == 0.0
1.23e2 == 123
1.23e-2 == 0.0123
True

数位分隔符

数值的字面值包含 _ 符号是合法的,_可以用来分隔数位,但 _ 不能放在数字的开头。

1000_000
123.456_789
0b101_010
0x_101_010
1052688

进制转换

int 除了用来创建整数,还可以将非十进制的数值字符串转换为十进制数值。

16 进制转换为 10 进制

int("0x10", base=16)
16

10 进制转换为 16 进制字符串

hex(16)
'0x10'