摘要:计算机竟然说这是错的!别慌,这不是你的问题,而是浮点数的“先天缺陷”。今天带你解锁Python中的Decimal类型,告别计算误差!
你是否遇到过这样的尴尬?
0.1 + 0.2 == 0.3 # 输出:False计算机竟然说这是错的!
别慌,这不是你的问题,而是浮点数的“先天缺陷”。
今天带你解锁Python中的Decimal类型,告别计算误差!
Python中的Decimal类型(来自decimal模块)是为解决浮点数精度问题而设计的十进制高精度数值类型,适用于金融、科学等需要精确计算的场景。
想象一下:
你开发了一个财务系统,用户存入0.1元,程序却显示0.1000000000000001元?
浮点数陷阱:计算机用二进制存储小数,像0.1这样的数会无限循环,导致误差!
Decimal的杀手锏:
from decimal import Decimal print(Decimal('0.1') + Decimal('0.2')) # 输出:0.3✅ 十进制存储,精准计算,和计算器一样靠谱!
1. 初始化秘诀:一定要用字符串!
Decimal('0.1') # ✅ 正确 Decimal(0.1) # ❌ 错误!会继承浮点数的误差⚠️ 直接传Float进去,误差会像病毒一样传染!
2. 精度控制:想算几位就几位
from decimal import getcontext getcontext.prec = 6 # 全局设置6位有效数字 a = Decimal('1.23456789') b = Decimal('2.3456789') print(a + b) # 输出3.58025(自动四舍五入)临时修改精度?用with localcontext,安全又灵活!
3. 四舍五入的大学问
财务人的灵魂拷问:10.025元到底舍还是入?
price = Decimal('10.025') rounded = price.quantize(Decimal('0.00')) # 默认舍入(四舍六入五成双) print(rounded) # 输出10.02(惊不惊喜?)想改规则?一行代码搞定:
getcontext.rounding = ROUND_HALF_UP # 经典四舍五入4. 小心这些隐藏的坑!
不要和float混算:
Decimal('1.5') + 0.5 # ❌ 报错! Decimal('1.5') + Decimal(str(0.5)) # ✅ 先转字符串 精度精确十进制近似二进制适用场景财务、科学计算图形、游戏等性能较慢极快内存占用较高低试试这段代码,感受Decimal的强大:
from decimal import Decimal, getcontext getcontext.prec = 10 print(Decimal('1') / Decimal('7')) # 输出0.142857142857142857...你在项目中踩过浮点数的坑吗?欢迎留言吐槽!
来源:信息科技云课堂