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

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

admin7个月前 (04-09)AI技术284

解决实际问题的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

。

相关文章

【大模型应用开发

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

什么是人工智能 ?

您可以使用 ML 训练 AI,使其精确、快速地执行任务。这可以通过自动化员工感到吃力或厌烦的业务部分来提高运营效率。同样,您可以使用 AI 自动化来腾出员工资源,用于更复杂和更具创造性的工作。...

前端开发高级应用:MuleRun如何连接Slack通知 MuleRun消息推送集成配置步骤实战案例|Duuu笔记

若MuleRun无法向Slack推送通知,需依次配置Incoming Webhook或Bot Token、在MuleRun中设置对应通知目标参数,并通过最小化任务测试验证;常见失败原因包括凭据错误、权...

几种主要的神经网络

卷积神经网络的输入为二维的像素整阵列,输出为这个图片的属性,当网络训练学习后,所输入的图片或许经过稍微的变换,但卷积神经网络还是可以通过识别图片局部的特征而将整个图片识别出来。 :该层...

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

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

深入理解前端开发:OpenClaw小龙虾新手怎么入门 OpenClaw小龙虾基础功能快速上手【教程】完全指南|Duuu笔记

OpenClaw“小龙虾”快速启动需五步:一、安装Node.js与Git并验证;二、执行官方脚本安装并校验版本与健康状态;三、运行dashboard开启Web控制台并创建任务;四、配置Ollama或Q...

发表评论

访客

看不清,换一张

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