讲师中心 微信公众号
AI工具推荐 视频效率加速

怎么在单元测试中利用断言检查两个浮点数是否在指定的误差范围内相等

酷浩酱_6810

酷浩酱_6810

发布时间:2026-04-16 17:32:06

|

740人浏览过

|

来源于php中文网

原创

pytest.approx 是最省心的浮点比较方案,支持 abs/rel 双模式并自动处理边界;math.isclose 适合需布尔返回值的场景;JUnit delta 需动态计算防负值;手写工具须单独处理 NaN 和 0。

怎么在单元测试中利用断言检查两个浮点数是否在指定的误差范围内相等

直接用 pytest.approx 是最省心的方案

如果你用的是 pytest,别自己写容差逻辑。pytest.approx 内置了相对误差(rel)和绝对误差(abs)双模式,自动处理边界情况,比如 0.0 或极小值。

常见错误是只传一个数字当 tolerance,比如 assert a == pytest.approx(b, 1e-6) —— 这实际是把 1e-6 当作 abs 参数,但写法易误解。明确写出来更安全:

  • assert result == pytest.approx(expected, abs=1e-9):固定绝对误差,适合量级稳定(如坐标、时间戳)
  • assert result == pytest.approx(expected, rel=1e-3):相对误差,适合跨数量级(如科学计算中 0.001 和 1000 都要测)
  • 两者可共存:pytest.approx(expected, abs=1e-12, rel=1e-5),取其中更宽松的那个生效

math.isclose 适合需要显式布尔判断的场景

当你不能抛异常、而要自己控制流程时(比如在测试 setup 中预检数据,或封装断言工具函数),math.isclose 更合适。它返回 True/False,不触发 AssertionError。

注意它的默认参数:rel_tol=1e-09, abs_tol=0.0。如果比较含 0 的值(如 math.isclose(1e-10, 0.0)),必须显式设 abs_tol,否则会失败:

  • math.isclose(a, b, abs_tol=1e-10):强制启用绝对容差
  • math.isclose(a, b, rel_tol=1e-6, abs_tol=1e-12):兼顾大小值,推荐组合
  • 别依赖默认 abs_tol——它是 0,对近零值毫无意义

JUnit 的 assertEquals delta 必须为正,且慎用 Math.min

Java 用户常误用 Math.min(expected, actual) 当 delta,这在值为负或一正一负时直接出错:delta 变成负数,JUnit 报 IllegalArgumentException。

正确做法是基于量级动态算 delta:

  • 用 Math.max(Math.abs(expected), Math.abs(actual)) * 1e-3 模拟相对误差
  • 下限兜底:Math.max(1e-9, Math.max(...) * 1e-3),避免 delta 趋近于 0
  • 固定值仅限调试用,比如 1e-6 适用于单精度图形计算,但别用于金融或物理仿真

自己写断言函数时,别忽略 0 和 NaN 的特殊处理

手写 assert_float_equal(a, b, tol) 类工具时,最容易漏掉两个点:

  • a 或 b 是 NaN:IEEE 规定 NaN != NaN,所以得先用 math.isnan() 单独判,否则 abs(a-b) 永远是 <code>False
  • a 和 b 异号但都很小(如 -1e-10 和 1e-10):此时相对误差失效,必须 fallback 到绝对误差
  • Python 中 float('inf') 和 -float('inf') 也要单独处理,math.isclose 已覆盖,但自定义逻辑常遗漏

真正难的不是算误差,而是想清楚「这个浮点数在业务里代表什么」——是温度(±0.1℃ 就够)、还是资金(必须精确到分)、还是模型输出(相对误差 1% 可接受)。delta 值从来不是技术参数,而是业务契约。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

4550

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

2941

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

1066

2025.10.24

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

0

2026.10.16

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

0

2026.10.16

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

0

2026.10.16

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

0

2026.10.15

Vue.js 中 ref 和 reactive 的区别
Vue.js 中 ref 和 reactive 的区别

Vue.js中ref和reactive的区别专题汇集两种响应式API的定义、访问方式、对象解构、侦听与性能取舍等文章,帮助结合实际状态类型选择合适写法。

0

2026.10.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn