0

0

Python decimal 模块的正确使用场景

冷漠man

冷漠man

发布时间:2026-02-17 13:59:02

|

737人浏览过

|

来源于php中文网

原创

必须用 decimal 而非 float 的场景是金融计算、会计对账等要求十进制小数精确表示的场合,因 float 基于二进制存在 0.1+0.2≠0.3 等精度问题,而 decimal 可确保十进制运算准确。

python decimal 模块的正确使用场景

什么时候必须用 decimal,而不是 float

金融计算、会计对账、任何要求「十进制小数精确表示」的场景,decimal 不是“更好”,而是“唯一正确”。float 基于二进制 IEEE 754,0.1 + 0.2 ≠ 0.3 是常态;而 decimal 按十进制算,0.1 + 0.2 就是 0.3。

常见错误现象:float 累加金额出现 199.99999999999997 或 200.00000000000003;数据库存入后读出值与原始值不一致(尤其 PostgreSQL 的 NUMERIC 字段)。

  • 银行转账、发票明细、税率计算、库存数量(带小数)必须用 Decimal
  • 科学计算、机器学习权重、物理模拟——用 float 更合适,decimal 会慢且无意义
  • decimal 不解决舍入逻辑问题,它只保证“按指定精度做十进制运算”,舍入方式仍需显式指定

Decimal 初始化时字符串比数字更安全

用字符串初始化 Decimal,才能完全避开 float 的精度污染。写 Decimal(0.1) 看似方便,实则已把 float 的误差带进来了。

示例对比:

立即学习Python免费学习笔记(深入)”;

微动100多用户微信服务平台带分销系统
微动100多用户微信服务平台带分销系统

系统包含模块:1、卖场系统适用客户:实体卖场,可以分类管理,每个分类设置一个客服,客服可以使用手机管理分类商品2、万能表单用户可以自定义表单字段,收集各样信息,并可以导出Excel3、第三方接口方便用户自己开发,目前仅支持text格式4、留言板可以显示用户的头像和昵称5、场景二维码这是高级接口的使用,方便统计用户来源6、一键分享一个仿微信公众号详情界面,可以分享到朋友圈7、婚纱摄影一个相册+店面展

下载
from decimal import Decimal
print(Decimal(0.1))        # Decimal('0.1000000000000000055511151231257827021181583404541015625')
print(Decimal('0.1'))      # Decimal('0.1')
  • 永远优先用字符串: Decimal('19.99')Decimal('1e-3')
  • 从用户输入、CSV、JSON 解析来的数字字符串,直接传给 Decimal,别先转 float
  • 数据库 ORM(如 SQLAlchemy)返回的 decimal.Decimal 对象可直接用;但若字段类型是 Float,读出来已是 float,再包一层 Decimal 也救不回精度

getcontext().prec 控制的是运算精度,不是显示位数

getcontext().prec = 2 并不会让 Decimal('1.234') 变成 '1.2';它影响的是后续所有算术运算的中间结果精度。这是最常被误解的一点。

比如:

from decimal import Decimal, getcontext
getcontext().prec = 2
a = Decimal('1.23') + Decimal('2.45')  # 结果是 Decimal('3.7'),不是 '3.68'
  • prec 是“有效数字位数”,不是“小数点后几位”——Decimal('123.456').quantize(Decimal('0.01')) 才控制小数位
  • 不同业务模块可能需要不同精度(如汇率保留 6 位,商品价格保留 2 位),别全局设死 getcontext().prec
  • 多线程下 getcontext() 是线程局部的,但修改它会影响当前线程所有后续运算,建议在关键计算前显式设置并恢复

和数据库交互时,注意 ORM 和驱动层的隐式转换

即使你代码里全程用 Decimal,如果数据库驱动或 ORM 把它自动转成 float 再塞进 SQL,精度就丢了。PostgreSQL 的 psycopg2 默认支持 Decimal,但 MySQL 的 pymysql 在某些版本里会把 DECIMAL 字段读作 float

  • 检查 ORM 配置:SQLAlchemy 中确保列定义为 Column(DECIMAL(precision=10, scale=2)),而非 Float
  • 测试读写闭环:写入 Decimal('123.45'),再查出来打印 type()repr(),确认仍是 Decimal 且值未变
  • 避免用 str()float() 中间转换:比如日志里打 str(my_decimal) 没问题,但 float(my_decimal) 一调就崩

真正麻烦的从来不是怎么创建一个 Decimal,而是整条链路——从输入解析、中间计算、ORM 映射、到最终展示——有没有哪一环偷偷把它变成了 float。这种隐式转换一旦发生,前面所有谨慎初始化都白搭。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

965

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

334

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

376

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1696

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

370

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1252

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

436

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号