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

怎么控制浮点数精度 round与decimal模块精准计算完全指南|Duuu笔记

admin2个月前 (04-01)AI技术50

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

相关文章

【大数据分析 | 深度学习】在Hadoop上实现分布式深度学习

一、Submarine(Hadoop生态系统) (一)Submarine 介绍 (三)Submarine 属于 Hadoop 生态系统 (四)Submarine 官网版...

【大模型应用开发

二、大模型的泛化与微调 模型的泛化能力:是指一个模型在面对新的、未见过的数据时,能够正确理解和预测这些数据的能力。在机器学习和人工智能领域,模型的泛化能力是评估模型性能的重要指标之一。...

跨平台机器学习:ML.NET架构及应用编程

平台上的一个机器学习框架,它提供了一套丰富的算法和工具,使得开发人员可以轻松地构建和部署机器学习模型。支持多种编程语言,包括等,这使得它成为跨平台机器学习的理想选择。的架构主要包括三个部分:数据读取、...

从入门到精通:前端开发之骡子快跑支持热点借势吗 骡子快跑节日营销文案生成|Duuu笔记

骡子快跑平台提供五步节日营销文案生成路径:一、调用内置32个节日模板库;二、输入热点事件触发动态生成;三、绑定自有素材库实现个性化延展;四、多角色视角协同输出;五、接入微信生态直发并校验合规性。 ☞...

AI实战详解:Perplexity 怎么做市场调研 Perplexity 市场分析实操教程【商业】最佳实践|Duuu笔记

掌握Perplexity AI市场调研需五步:一、结构化提问嵌入地域/时间/主体/指标四要素;二、限定PDF等原始信源提升可信度;三、分步提问生成制表符分隔文本以自动导入Excel;四、启用Pro S...

前端开发高级应用:Minimax视频生成提示词中文还是英文好实战案例|Duuu笔记

优先使用英文提示词,因其更契合模型训练语料并能稳定触发视觉特征;其次可采用中英混合策略兼顾文化专有名词;纯中文适用于强本土化场景;最终需通过多指标对比验证最优语言形式。 ☞☞☞AI 智能聊天, 问答...

发表评论

访客

看不清,换一张

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