当前位置:首页 > AI技术 > 正文内容

理怎么控制浮点数 round与decimal模块准计算|Duuu笔记

admin7天前AI技术25

解决实际问题的Python最佳实践

Python的round()采用银行家舍入法且受浮点精度限制,如round(2.675,2)得2.67;高精度场景应使用Decimal模块,从字符串构造并用quantize()控制小数位。

为什么

round()

有时不按预期四舍五入?

Python 的

round()

函数不是“数学意义上的四舍五入”,而是遵循“四舍六入五成双”(银行家舍入法),且底层依赖 IEEE 754 浮点表示 —— 这意味着很多十进制小数根本无法精确存储。

常见错误现象:

round(2.675, 2)

返回

2.67

而不是

2.68

,因为

2.675

在内存中实际是略小于

2.675

的近似值。

这不是 bug,是浮点数表示的固有限制

round()

float

输入操作,输入本身已失真

它适合快速展示、非金融类近似处理,不适合精度敏感场景

什么时候必须用

decimal

模块?

当你需要可预测、可重现、符合十进制直觉的算术时 —— 比如价格计算、财务报表、测试断言中的数值比较。

使用场景:

Python免费学习笔记(深入)

”;

计算商品总价含税,要求分位严格对齐

单元测试中验证

0.1 + 0.2 == 0.3

类断言(

float

下恒为

False

配置中定义精度策略(如“保留两位小数,向上进位”)

关键参数差异:

自由画布

百度文库和百度网盘联合开发的AI创作工具类智能体

下载

decimal.getcontext().prec

控制

有效数字位数

(不是小数位数)

真正控制小数位的是

quantize()

方法,需配合

Decimal('0.01')

这类模板

运算前务必把原始数字转为

Decimal

字符串构造,避免

float

入口污染:

from decimal import Decimal

# ✅ 正确:从字符串初始化

d = Decimal('2.675').quantize(Decimal('0.01'))

❌ 错误:先走 float,精度已丢

d = Decimal(2.675).quantize(Decimal('0.01')) # 实际是 Decimal('2.67499999999999982236431605997495353221893310546875')

decimal

的性能和兼容性代价

decimal

是纯 Python 实现的高精度类型,比原生

float

慢 10–100 倍,尤其在大量循环或科学计算中明显。

不支持 NumPy 数组原生运算,混合使用需显式转换,易触发隐式降级

与 JSON、Pandas 默认序列化不兼容:

json.dumps(Decimal('1.23'))

报错,需自定义 encoder

第三方库(如 requests、SQLAlchemy)通常只认

float

int

,传

Decimal

可能被静默转成

float

所以:

仅在输入/输出边界(如读取 CSV 金额列、写入数据库前)启用

decimal

中间计算若不涉及用户可见精度,仍可用

float

提速

isinstance(x, Decimal)

替代

type(x) == Decimal

,更安全

一个可靠的小数位控制函数长什么样?

别封装

round()

,直接封装

quantize()

,并强制字符串输入路径:

from decimal import Decimal, ROUND_HALF_UP

def round_decimal(value: str | float | int, places: int = 2) -> Decimal:

d = Decimal(str(value)) # 强制过 str,切断 float 失真链

quantize_to = Decimal('1e-{}'.format(places))

return d.quantize(quantize_to, rounding=ROUND_HALF_UP)

示例

round_decimal('2.675', 2) # Decimal('2.68')

round_decimal(2.675, 2) # Decimal('2.68') —— 注意:这里靠 str(2.675) 补救,但不推荐传 float

float

仍存在风险,最好在调用方就确保输入是字符串或整数

ROUND_HALF_UP

是大多数人想要的“传统四舍五入”

如果要对接会计规则,可能需要

ROUND_HALF_EVEN

ROUND_UP

浮点精度问题从来不在“怎么修”,而在于“在哪修”——边界越早收紧,后续越省事。很多人卡在

decimal

用了但结果还是不对,八成是第一步从

float

构造了

Decimal

相关文章

什么是LLM?看这一篇就够了!

一、全套AGI大模型学习路线 AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能! 二、640套AI大模型报告合集 这套包含640份报告的合集,涵盖了AI大...

神经网络分类总结

从网络性能角度可分为连续型与离散型网络、确定性与随机性网络。 从网络结构角度可为前向网络与反馈网络。 从学习方式角度可分为有导师学习网络和无导师学习网络。 按连续突触性...

神经网络中的单层神经网络

神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。人脑中的神经网络是一个非常复杂的组织。成人的大脑中估计有1000亿个神经元之多。 看一个经典的神经网络。这是一个包...

推荐10个AI人工智能技术网站

除了研究和开发人工智能技术,OpenAI还积极参与人工智能伦理和安全的研究和探讨。 认为,人工智能技术的发展必须遵循伦理和法律的规范,以确保人工智能的应用不会对人类带来负面影响。...

一文讲清神经网络、BP神经网络、深度学习的关系

人工神经网络中的顶级代表。往往说《神经网络》就是指《BP神经网络》。 大家研究着各种神经网络,研究得不亦乐乎, 来了两个家伙Romelhart 和Mcclelland,...

前端开发实战详解:骡子快跑怎么注册账号 骡子快跑账号注册流程最佳实践|Duuu笔记

骡子快跑注册仅需1分钟,但激活码需从Discord指定频道获取,输错3次将锁账户24小时;积分与注册邮箱强绑定且不可更换;部分地区即使注册成功也无法运行Agent。 ☞☞☞AI 智能聊天, 问答助手...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。