____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?