首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Types: 4. Numeric Types — int, float, long, complex

4. Numeric Types — int, float, long, complex

有四种不同的数字类型:普通整数长整数浮点数复数。另外,布尔也是普通整数的一个子类型。在C 中实现纯整数(也称为整数long,它使它们具有至少32位的精度(sys.maxint总是设置为当前平台的最大纯整数值,最小值为-sys.maxint - 1)。长整数具有无限精度。浮点数通常double在C中实现; 有关运行程序的机器的浮点数的精度和内部表示的信息可在sys.float_info。复数有一个实部和虚部,每个部分都是一个浮点数。要从复数z中提取这些零件,请使用z.realz.imag。(标准库包含额外的数字类型,fractions用于保存有理数据,并decimal保存具有用户可定义精度的浮点数。)

数字由数字文字或内置函数和运算符的结果创建。未经修饰的整数文字(包括二进制,十六进制和八进制数字)会产生纯整数,除非它们表示的值太大而不能表示为普通整数,在这种情况下,它们会产生长整数。一个整数文字'L''l'后缀产量长整型('L'是首选,因为1l看起来太的十一!)。包含小数点或指数符号的数字文字会生成浮点数字。追加'j''J'数字文字会产生一个虚数(一个具有零实数部分的复数),您可以将其添加到整数或浮点数以获得具有实部和虚部的复数。

Python完全支持混合算术:当二进制算术运算符具有不同数值类型的操作数时,具有“窄”类型的操作数会扩展到另一个操作数,其中纯整数比窄整数窄于浮点比窄比复杂。混合类型的数字之间的比较使用相同的规则。[2]的构造int()long()float(),和complex()可以用于产生特定类型的号码。

所有内置的数字类型都支持以下操作。有关运营商的优先事项,请参阅电力运营商和后续章节。

手术

结果

笔记

x + y

x与y之和

x - y

x与y的差

x * y

x与y的乘积

x / y

x与y的商数

(1)

x // y

x与y的商的整数部分

(4)(5)

x%y

x / y的余数部分

(4)

-X

x的负数

+ X

x的正数

ABS(x)的

绝对值

(3)

int(x)的

x转换为整数

(2)

long(x)的

x转换为长整数

(2)

float(x)的

x转换为浮点

(6)

complex(RE,IM)

与实数部分相关的复数,虚数部分im。默认为零。

c.conjugate()

复数c的共轭。(实际身份)

divmod(x,y)

返回tuple(x//y,x%y)

(3)(4)

pow(x,y)

x到权力y

(3)(7)

x ** y

x到权力y

(7)

笔记:

  • 对于(纯或长)整数除法,结果是一个整数。结果总是向负无穷大舍入:1/2是0,(-1)/ 2是-1,1 /( - 2)是-1,(-1)/( - 2)是0.请注意,如果任一操作数是长整型,则结果为长整数,无论​​数值如何。
  • 像使用相关函数一样,使用int()long()截断为零的浮点数转换math.trunc()。使用该功能math.floor()向下滚动并向math.ceil()上滚动。
  • 有关完整说明,请参阅内置函数。
  • 自从版本2.3开始弃用:楼层划分运算符,模运算符和divmod()函数不再为复数定义。相反,abs()如果适用,则使用该函数将其转换为浮点数。
  • 也被称为整数除法。结果值是一个整数,虽然结果的类型不一定是int。
  • 对于非数字(NaN)和正或负无穷,float还接受带有可选前缀“+”或“ - ”的字符串“nan”和“inf”。2.6版本中的新功能。
  • Python定义pow(0, 0)0 ** 0将会1像编程语言一样常见。

所有numbers.Real类型(intlongfloat)还包括以下操作:

Operation

结果

math.trunc(x)的

x截断为Integral

round(x,n)

x四舍五入为n位数,从零开始取整。如果省略n,则默认为0。

math.floor(x)的

作为float <= x的最大整数

math.ceil(x)的

作为float> = x的最小整数

4.1。整数类型的按位运算

按位运算只对整数有意义。负数被视为它们的2的补码值(假定在操作过程中没有溢出发生的位数足够大)。

二进制按位运算的优先级均低于数值运算并高于比较; 一元运算~与其他一元运算(+-)具有相同的优先级。

此表列出按升序优先级排序的按位运算:

Operation

结果

笔记

x | 和

按位或x和y

x ^ y

按位排他或x和y

x&y

按位和x和y

x << n

x左移n位

(1)(2)

x >> n

x右移n位

(1)(3)

〜X

x的位反转

注释:

  • 负转移次数是非法的,并导致a ValueError被提出。
  • 左移n位相当于乘以pow(2, n)。如果结果超出纯整数范围,则返回一个长整数。
  • 右移n位相当于除以pow(2, n)

4.2。整数类型的其他方法

整数类型实现numbers.Integral 抽象基类。另外,他们还提供了另一种方法:

int.bit_length()long.bit_length()

返回表示二进制整数所需的位数,不包括符号和前导零:

代码语言:javascript
复制
>>> n = -37
>>> bin(n)
'-0b100101'
>>> n.bit_length()
6

更确切地说,如果x不为零,则x.bit_length()是唯一的正整数k这样2**(k-1) <= abs(x) < 2**k。等价地,当abs(x)小到足以得到正确的舍入对数时,则k = 1 + int(log(abs(x), 2))。如果x是零,则x.bit_length()返回0

相当于:

代码语言:javascript
复制
def bit_length(self):
    s = bin(self)       # binary representation:  bin(-37) --> '-0b100101'
    s = s.lstrip('-0b') # remove leading zeros and minus sign
    return len(s)       # len('100101') --> 6

2.7版本的新功能。

4.3。其他方法浮动

浮点类型实现numbers.Real 抽象基类。float还有以下附加方法。

float.as_integer_ratio()

返回一对整数,其比例与原始浮点数完全相等,并带有一个正的分母。提高OverflowError无穷大和ValueErrorNaNs。

2.6版本中的新功能。

float.is_integer()

返回True如果浮子实例是有限的与积分值,并False以其他方式:

代码语言:javascript
复制
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False

2.6版本中的新功能。

两种方法支持与十六进制字符串的转换。由于Python的浮点数在内部存储为二进制数,因此将浮点数转换为十进制字符串或从十进制字符串转换浮点数通常会导致一个小的舍入误差 相反,十六进制字符串允许精确表示和指定浮点数。这在调试和数值工作时非常有用。

float.hex()

将浮点数的表示形式返回为十六进制字符串。对于有限的浮点数,这种表示将总是包括前导0x和尾随p以及指数。

2.6版本中的新功能。

float.fromhex(s)

Class方法返回由十六进制字符串s表示的float 。字符串s可能有前导和尾随空白。

2.6版本中的新功能。

请注意,这float.hex()是一种实例方法,而它float.fromhex()是一种类方法。

十六进制字符串采用以下形式:

代码语言:javascript
复制
[sign] ['0x'] integer ['.' fraction] ['p' exponent]

其中可选sign可以是+或者-integer并且fraction是十六进制数字的字符串,并且exponent是具有可选前导符号的十进制整数。大小写不重要,整数或小数中至少有一个十六进制数字。此语法与C99标准的6.4.4.2节中指定的语法类似,也与Java 1.5之后的语法类似。特别是,输出float.hex()可用作C或Java代码中的十六进制浮点字面值,并且由C的%a格式字符或Java 产生的十六进制字符串Double.toHexString被接受float.fromhex()

请注意,指数是用十进制而不是十六进制编写的,它给出了乘以系数的2的幂。例如,十六进制字符串0x3.a7p10表示浮点数(3 + 10./16 + 7./16**2) * 2.0**10,或者3740.0

代码语言:javascript
复制
>>> float.fromhex('0x3.a7p10')
3740.0

将反向转换应用于3740.0给出代表相同数字的不同十六进制字符串:

代码语言:javascript
复制
>>> float.hex(3740.0)
'0x1.d380000000000p+11'

扫码关注腾讯云开发者

领取腾讯云代金券