python 大整数的精确计算——除法(/)、整数除法(//)

本文探讨了浮点数运算的近似性导致的精度问题,以及整数除法在大整数运算中的应用。即便使用Decimal模块进行高精度计算,也存在精度损失。示例展示了不同运算方法下的结果差异,并提到了Decimal除法的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

____tz_zs

误差来源

这是因为浮点运算永远只是一个近似值,特别是当你超出了你的CPU能够准确建模的范围(因为浮点运算是在硬件中处理的)。
整数除法不需要把整数转换成浮点数,它只需要用整数相除,而在 Python 中,整数可以任意大而不损失精度。


big_int = 10 ** 40 + 23
print(f"原始: {big_int}")
print(f"整数除法: {big_int // 2}")
print(f"浮点除法:{int(big_int / 2)}")
print(f"浮点除法:{(big_int / 2):.1f}")
print(f"整数除法转浮点表示:{(big_int // 2):.1f}")

"""
原始: 10000000000000000000000000000000000000023
整数除法: 5000000000000000000000000000000000000011
浮点除法:5000000000000000151893014213501833445376
浮点除法:5000000000000000151893014213501833445376.0
整数除法转浮点表示:5000000000000000151893014213501833445376.0
"""

Decimal 大数字计算同样存在丢失问题

Decimal模块广泛用于float的精确计算,但是同样的,对于大整数的运算,会丢失尾部精度。


from decimal import Decimal

big_int = 10 ** 40 + int("2" * 20)
print(f"原始: {big_int}")
print(f"整数除法: {big_int // 2}")
print(f"浮点除法:{int(big_int / 2)}")
print(f"浮点除法:{(big_int / 2):.1f}")
print(f"整数除法:{(big_int // 2):.1f}")

"""
原始: 10000000000000000000022222222222222222222
整数除法: 5000000000000000000011111111111111111111
浮点除法:5000000000000000151893014213501833445376
浮点除法:5000000000000000151893014213501833445376.0
整数除法:5000000000000000151893014213501833445376.0
"""

d = Decimal(big_int) / Decimal(2)
print(type(d))
print(f"decimal:{d:.1f}")
print(f"decimal:{int(d)}")
"""
<class 'decimal.Decimal'>
decimal:5000000000000000000011111111000000000000.0
decimal:5000000000000000000011111111000000000000
"""

//不能用于Decimal运算

d = Decimal(big_int) // Decimal(2)
"""
decimal.InvalidOperation: [<class 'decimal.DivisionImpossible'>]
"""

参考

Why are the results of integer division and converting to an int after division different for large numbers?
How to manage division of huge numbers in Python?

《decimal — 十进制定点和浮点运算》
《decimal — 高精度计算模块》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值