Skip to content

04|数字与运算

Python 处理数字的能力覆盖了日常计算的大部分场景。理解数字类型和运算符的行为,能避免"2 除以 3 等于 0"这类意外结果。

一、整数

Python 的 int 可以表示任意大小的整数,不受固定位数限制。

python
a = 42
b = -10
c = 1_000_000   # 下划线分隔,提升可读性,值是 1000000

进制表示:

python
0b1010     # 二进制,等于十进制 10
0o17       # 八进制,等于十进制 15
0xFF       # 十六进制,等于十进制 255

进制转换函数:

python
bin(10)    # '0b1010'
oct(15)    # '0o17'
hex(255)   # '0xff'
int("0b1010", 2)   # 10,从字符串按指定进制转整数

二、浮点数

python
pi = 3.14159
scientific = 1.23e4   # 科学计数法,等于 12300.0

浮点数遵循 IEEE 754 标准,存在精度问题:

python
0.1 + 0.2   # 0.30000000000000004,不是精确的 0.3

比较浮点数时,不要用 ==,而用误差范围:

python
abs(0.1 + 0.2 - 0.3) < 1e-9   # True

需要精确小数计算时,用 decimal 模块:

python
from decimal import Decimal

a = Decimal("0.1")
b = Decimal("0.2")
a + b   # Decimal('0.3')

注意 Decimal("0.1") 传入的是字符串。传入浮点数 Decimal(0.1) 会先引入浮点精度误差,再转 Decimal 也救不回来。

三、算术运算符

python
a + b      # 加法
a - b      # 减法
a * b      # 乘法
a / b      # 除法,结果总是浮点数
a // b     # 整除(地板除),结果向下取整
a % b      # 取余
a ** b     # 幂运算
-a         # 取负

关键区别:

python
7 / 2      # 3.5,普通除法
7 // 2     # 3,整除
7 % 2      # 1,取余

整除对负数的行为需要留意:

python
-7 // 2    # -4,向下取整(往负无穷方向)
-7 % 2     # 1,结果始终与除数同号

四、复合赋值

python
x = 10
x += 5     # x = x + 5,现在 x 是 15
x -= 3     # x = x - 3
x *= 2     # x = x * 2
x //= 4    # x = x // 4

复合赋值是先计算等号右边的完整表达式,再赋值:

python
x = 5
x += 2 + 3   # 等价于 x = x + (2 + 3),x 变成 10

五、类型转换

python
int(3.7)       # 3,截断小数部分(不是四舍五入)
int("42")      # 42,字符串转整数
int("FF", 16)  # 255,按十六进制解析

float(3)       # 3.0
float("3.14")  # 3.14

str(42)        # '42'
str(3.14)      # '3.14'

转换失败时抛出异常:

python
int("hello")   # ValueError: invalid literal for int()
float("")      # ValueError: could not convert string to float

六、内置数学函数

python
abs(-10)       # 10,绝对值
round(3.7)     # 4,四舍五入
round(2.5)     # 2,银行家舍入法(偶数优先)
round(3.14159, 2)   # 3.14,保留两位小数

max(1, 5, 3)   # 5
min(1, 5, 3)   # 1
sum([1, 2, 3]) # 6
pow(2, 3)      # 8,等于 2**3
pow(2, 3, 5)   # 3,(2**3) % 5,效率更高

更复杂的数学运算(三角函数、对数、平方根等)在 math 模块里:

python
import math

math.sqrt(16)      # 4.0
math.ceil(3.2)     # 4,向上取整
math.floor(3.9)    # 3,向下取整
math.pi            # 3.141592653589793

记忆锚点/ 总是返回浮点数,// 是整除;浮点数有精度问题,精确计算用 Decimalint() 截断不是四舍五入;round(2.5) 等于 2(偶数优先);负数整除向负无穷方向取整。