python中精度处理:decimal

decimal 是 Python 标准库中的一个模块,专门用于十进制浮点数运算 。它的核心作用是解决二进制浮点数(即普通的 float)在精度上的一些固有问题,能够进行精确的、符合人类数学直觉的十进制运算

为什么需要 decimal

先看一个例子:

复制代码
print(0.1 + 0.2)          # 输出: 0.30000000000000004
print(0.1 + 0.2 == 0.3)   # 输出: False

这是因为计算机使用二进制(基数为2)来表示数字,而像 0.1 这样的十进制小数在二进制中是无限循环的,无法被精确表示。这在金融计算、科学计算等对精度有严格要求的场景下是不可接受的。

decimal 模块正是为此而生,它使用十进制(基数为10)进行计算,可以精确地表示十进制小数。

decimal 的基本用法

1. 创建 Decimal 对象

为避免精度损失,强烈建议从字符串 创建 Decimal

复制代码
from decimal import Decimal

# 正确:从字符串创建
d1 = Decimal('0.1')
d2 = Decimal('0.2')
print(d1 + d2)  # 输出: 0.3

# 不推荐:从浮点数创建,会继承浮点数的精度问题
d3 = Decimal(0.1)
print(d3)       # 输出: 0.1000000000000000055511151231257827021181583404541015625
2. 基本运算

Decimal 支持所有常规的算术运算:

复制代码
from decimal import Decimal

a = Decimal('10.5')
b = Decimal('3.2')

print(a + b)    # 13.7
print(a - b)    # 7.3
print(a * b)    # 33.60
print(a / b)    # 3.28125
3. 设置精度和上下文

可以通过 getcontext() 来设置全局的精度(有效位数)和舍入模式。

复制代码
from decimal import Decimal, getcontext

# 设置全局精度为 6 位有效数字
getcontext().prec = 6

print(Decimal('1') / Decimal('7'))  # 输出: 0.142857
print(Decimal('1.23456789'))        # 输出: 1.23457(四舍五入到6位)

在特定的代码块中,也可以使用 localcontext 来临时覆盖全局上下文:

复制代码
from decimal import Decimal, localcontext

with localcontext() as ctx:
    ctx.prec = 2
    print(Decimal('1') / Decimal('7'))  # 输出: 0.14

# 退出 with 块后,精度恢复为全局设置
print(Decimal('1') / Decimal('7'))      # 输出: 0.142857

Decimal vs float vs Fraction

类型 适用场景 特点
float 科学计算、图形处理等对精度要求不高的场景 速度快,直接使用硬件浮点单元
Decimal 金融、财务、货币计算绝对禁止精度丢失的业务逻辑 精度高,符合十进制运算习惯,但速度较慢
Fraction 需要精确表示有理数(分数)的场景,如数学推导 用分子分母表示,不会丢失精度

建议是:日常科学计算用 float,金钱和财务计算必须用 Decimal,涉及分数的数学问题优先考虑 Fraction

相关推荐
DeepVisionary5 小时前
谷歌 Gemini Omni 1.1 Flash 正式发布:4K 视频、40 秒场景延伸,视频生成进入按 token 计费时代
python·自动化
阡之尘埃5 小时前
Python数据分析案例85——大模型微调全流程(SFT的LoRA微调)
人工智能·python·深度学习·语言模型·llm·微调·千问
海兰5 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(三)
javascript·python·金融
cvcode_study6 小时前
Ollama+ComfyUI 多模态
大数据·人工智能·python
星核0penstarry7 小时前
试一试用gr.Workflow把AI多步骤串联变成可视化画布
人工智能·python·ai作画·api·ai编程·工作流·api聚合平台
taller_20007 小时前
【005】PiE 与传统 VBA 的核心区别
python·vba·pie·py
海兰7 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(一)
javascript·python·金融
大衛說7 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
小猴子爱上树8 小时前
跨境电商翻译工具推荐:批量图片翻译、视频字幕翻译、智能抠图一站式搞定
人工智能·python·音视频
丈剑走天涯8 小时前
基于 Python 3 语法的 PyCharm 练习示例,涵盖列表操作、类型判断及数据清洗等核心知识点
windows·python·pycharm