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

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

admin7个月前 (04-01)AI技术183

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

。

相关文章

【大模型应用开发

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

Unity 机器学习 基础

ML-Agents 资产导入 Unity 场景创建 Unity 代码部分 Anaconda 执行 rollerball_config.yaml 机器学习逻辑处理...

使用 ESP

针对该分类问题,我们使用了 Kaggle 手势识别数据集 中的一个开源数据集。原始数据集包括 10 个类别,我们只使用了其中 6 个。这些类别更容易识别,且日常生活中更有用,如...

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

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

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

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

bp神经网络是什么网络,神经网络和bp神经网络

1、前馈神经网络:一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层间没有反馈。 2、BP神经网络:是一种按照误差逆向传播...

发表评论

访客

看不清,换一张

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