1. Python数字类型概述
在Python中,数字类型主要分为整数(int)和浮点数(float)两大类。整数是没有小数部分的数字,可以是正数、负数或零;而浮点数则包含小数部分,用于表示实数。Python还提供了decimal模块来处理高精度的十进制浮点数运算,以及fractions模块来处理分数。
注意:Python 3中整数没有大小限制,可以表示任意大的数值(仅受内存限制),而浮点数遵循IEEE 754双精度标准。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 整数类型详解
2.1 整数表示与运算
Python中的整数可以直接用十进制表示,也可以用0b、0o、0x前缀分别表示二进制、八进制和十六进制:
python复制a = 42 # 十进制
b = 0b101010 # 二进制,等于42
c = 0o52 # 八进制,等于42
d = 0x2A # 十六进制,等于42
整数支持所有基本算术运算:
- 加法:
+ - 减法:
- - 乘法:
* - 除法:
/(返回浮点数) - 整除:
// - 取模:
% - 幂运算:
**
2.2 整数运算的特殊情况
整数除法在Python 3中总是返回浮点数,这与Python 2不同。如果需要整数结果,应使用//运算符:
python复制print(5 / 2) # 输出2.5
print(5 // 2) # 输出2
大整数运算时,Python会自动处理,不会溢出:
python复制large_num = 10**1000 # 一个非常大的数
print(large_num * large_num) # 仍然能正确计算
3. 浮点数类型详解
3.1 浮点数表示与精度
Python浮点数遵循IEEE 754双精度标准,提供约15-17位有效数字精度。浮点数可以用小数形式或科学计数法表示:
python复制f1 = 3.141592653589793
f2 = 1.23e-4 # 等于0.000123
浮点数运算可能存在精度问题,这是二进制浮点数的固有特性:
python复制print(0.1 + 0.2) # 输出0.30000000000000004
3.2 浮点数特殊值
Python浮点数支持几个特殊值:
float('inf'):正无穷大float('-inf'):负无穷大float('nan'):非数字(Not a Number)
这些值可用于表示数学上的无穷大或未定义结果:
python复制print(1e308 * 10) # 输出inf
print(float('inf') - float('inf')) # 输出nan
4. Decimal模块:高精度十进制运算
4.1 Decimal基本用法
当需要精确的十进制运算时(如金融计算),应使用decimal模块:
python复制from decimal import Decimal, getcontext
# 创建Decimal对象
a = Decimal('0.1')
b = Decimal('0.2')
print(a + b) # 精确输出0.3
# 设置全局精度
getcontext().prec = 6 # 6位有效数字
Decimal可以通过字符串或整数构造,避免浮点数精度问题:
python复制# 正确方式
d1 = Decimal('0.1')
# 错误方式(会引入浮点数误差)
d2 = Decimal(0.1)
4.2 Decimal上下文控制
Decimal的运算行为由上下文(context)控制,可以设置精度、舍入方式等:
python复制ctx = getcontext()
ctx.prec = 28 # 28位精度
ctx.rounding = 'ROUND_HALF_UP' # 四舍五入
常用舍入模式:
ROUND_CEILING:向正无穷舍入ROUND_FLOOR:向负无穷舍入ROUND_DOWN:向零舍入ROUND_HALF_UP:四舍五入ROUND_HALF_EVEN:银行家舍入法
4.3 Decimal运算示例
Decimal支持所有基本数学运算,并保持高精度:
python复制a = Decimal('1.23456789')
b = Decimal('9.87654321')
print(a + b) # 加法
print(a * b) # 乘法
print(a.sqrt()) # 平方根
print(a.ln()) # 自然对数
5. Fractions模块:分数运算
对于需要精确分数表示的情况,可以使用fractions模块:
python复制from fractions import Fraction
a = Fraction(1, 3) # 1/3
b = Fraction(1, 2) # 1/2
print(a + b) # 输出5/6
print(a * b) # 输出1/6
分数可以与整数、浮点数混合运算:
python复制print(Fraction(1, 2) + 0.5) # 输出1.0
6. 数字类型转换与比较
6.1 类型转换
Python数字类型可以相互转换:
python复制i = 42
f = float(i) # 转换为浮点数
d = Decimal(i) # 转换为Decimal
fr = Fraction(i, 1) # 转换为分数
6.2 类型比较
比较不同类型的数字时,Python会自动进行类型转换:
python复制print(1 == 1.0) # True
print(Decimal('1.0') == 1.0) # True
但Decimal和Fraction之间的比较需要显式转换:
python复制d = Decimal('0.5')
f = Fraction(1, 2)
print(float(d) == float(f)) # True
7. 数学函数与运算
Python的math模块提供了常用数学函数:
python复制import math
print(math.sqrt(2)) # 平方根
print(math.sin(math.pi/2)) # 三角函数
print(math.log(100, 10)) # 对数
对于Decimal对象,应使用Decimal自身的方法:
python复制d = Decimal('2.0')
print(d.sqrt()) # 使用Decimal的平方根方法
8. 实际应用建议
- 金融计算:始终使用Decimal,避免浮点数精度问题
- 科学计算:对于性能敏感的场景,可以使用浮点数
- 精确分数:使用Fraction模块
- 大整数运算:Python原生整数类型已足够
重要提示:在比较浮点数时,不要直接使用==,而应检查两数差值是否小于某个极小值(如1e-9),以避免精度问题导致的错误判断。
9. 性能考虑
- 整数运算最快
- 浮点数运算次之
- Decimal运算最慢,但精度最高
- 对于大量数学运算,考虑使用NumPy等专门库
python复制# 性能对比示例
import timeit
def test_float():
return 0.1 + 0.2
def test_decimal():
return Decimal('0.1') + Decimal('0.2')
print(timeit.timeit(test_float)) # 约0.1微秒
print(timeit.timeit(test_decimal)) # 约5微秒
10. 常见问题与解决方案
问题1:为什么0.1 + 0.2不等于0.3?
这是二进制浮点数的固有特性。解决方案:
python复制# 方法1:使用round函数
round(0.1 + 0.2, 1) == 0.3
# 方法2:使用Decimal
Decimal('0.1') + Decimal('0.2') == Decimal('0.3')
问题2:如何处理大数运算?
Python整数没有大小限制,可以直接使用。对于极大浮点数,可使用科学计数法或Decimal:
python复制big_num = 1e300 * 1e300 # 可能溢出
safe_big_num = Decimal('1e300') * Decimal('1e300') # 安全
问题3:如何格式化数字输出?
使用字符串格式化或format函数:
python复制num = 1234.5678
print(f"{num:.2f}") # 1234.57
print("{:,.2f}".format(num)) # 1,234.57
对于Decimal,可以先用quantize方法舍入:
python复制from decimal import Decimal, ROUND_HALF_UP
d = Decimal('1234.5678')
print(d.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)) # 1234.57
