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

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

admin2周前 (04-01)AI技术18

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

相关文章

神经网络分类总结

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

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

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

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

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

深入理解前端开发:Minimax 视频生成中负面提示词(Negative Prompt)写法完全指南|Duuu笔记

Minimax视频生成中负面提示词需用英文、逗号分隔,支持权重调节(如(blurry:1.3)),按构图/主体/画质/风格四类精简选取,禁用not/no/中文及违规词,须通过A/B测试验证有效性。...

深入理解前端开发:Minimax视频生成黑科技:复杂动作模拟完全指南|Duuu笔记

为精准模拟复杂动作,需采用分帧提示词构建、骨骼关键点引导注入和多阶段动作蒸馏三法:一、将动作拆解为带空间姿态的关键帧序列并加物理约束;二、注入2D/3D关键点坐标锚定关节位置;三、通过粗生成→特征提取...

大模型超详细盘点!常用的大模型及其优缺点、有潜力的大模型、国内大模型行业落地的现况、国内大模型优势、挑战与前景

除了上述大模型外,还有一些有潜力的大模型值得关注,如: 华为云——盘古大模型 :华为基于Transformer架构打造的超大规模人工智能模型,具有万亿级别参数,可以在图像、语音...

发表评论

访客

看不清,换一张

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