0

0

如何在Java中比较两个浮点数是否相等_设置精度阈值(Epsilon)的方法

P粉602998670

P粉602998670

发布时间:2026-03-18 14:29:31

|

527人浏览过

|

来源于php中文网

原创

应使用容差值 epsilon 判断 double 相等,因浮点数二进制无法精确表示十进制小数(如 0.1+0.2≠0.3),== 比较会因精度误差返回 false,Double.compare 也无法解决精度问题。

如何在java中比较两个浮点数是否相等_设置精度阈值(epsilon)的方法

Java里直接用 == 比较两个 double 会出错

浮点数在二进制中无法精确表示大多数十进制小数,比如 0.1 + 0.2 的结果不是 0.3,而是 0.30000000000000004。所以用 == 判断相等大概率失败,哪怕肉眼看起来一样。

常见错误现象:0.1 + 0.2 == 0.3 返回 false;单元测试里断言 assertEquals(expected, actual) 报错但数值打印出来“明明一样”。

  • 永远别对 floatdouble== 做逻辑相等判断
  • Double.compare(a, b) == 0 都不行——它比较的是 IEEE 754 位模式,仍会把 0.0-0.0 当作不同,且不解决精度误差问题
  • 需要自己定义“多近才算相等”,也就是引入一个极小的容差值 epsilon

Math.abs(a - b) 是最常用做法

这是手动实现浮点数“近似相等”的核心逻辑:计算两数之差的绝对值,看是否落在可接受误差范围内。

使用场景:写工具方法、单元测试断言、业务逻辑中需判断计算结果是否落在预期区间(如物理模拟、金融四舍五入前校验)。

立即学习Java免费学习笔记(深入)”;

  • epsilon 不是越小越好——设成 1e-17 可能比 double 的最低有效位还小,反而没意义
  • 典型取值:1e-6(适合一般工程计算),1e-9(高精度需求),1e-15(接近 double 机器精度极限)
  • 注意:如果 ab 是极大值(如 1e308),相对误差更合理,此时应改用 Math.abs(a - b)

简单示例:

一点PPT
一点PPT

一句话生成专业PPT,AI自动排版配图

下载
public static boolean equals(double a, double b, double epsilon) {
    return Math.abs(a - b) < epsilon;
}

JUnit 5 的 Assertions.assertEquals(double, double, double) 就是封装了这个逻辑

写测试时别自己手写容差判断,直接用框架提供的重载方法,语义清晰且自带报错信息。

参数差异:assertEquals(expected, actual, epsilon) —— 第三个参数是最大允许误差,不是百分比,也不是相对误差。

  • 如果漏传第三个参数,调用的是 assertEquals(double, double),它内部用的是 Double.compare,**仍然会出错**
  • JUnit 4 用的是 assertEquals(double, double, double),签名一致,但底层实现略有不同(不影响使用)
  • 注意:这个方法对 NaN 的处理是——只要任一参数为 NaN,就返回 false(符合 IEEE 754 规范)

别忽略 FloatDouble 的静态方法 isFiniteisNaN

真实业务中,参与比较的浮点数可能来自外部输入、解析失败或计算溢出,出现 NaNInfinity-Infinity。这时候直接套用 Math.abs(a - b) 会得到意外结果。

例如:Math.abs(Double.NaN - 1.0)NaN,而 NaN 永远为 <code>false,但你可能希望它抛异常或明确返回 false

  • 建议在比较前加校验:if (!Double.isFinite(a) || !Double.isFinite(b)) return false;
  • Double.isNaN(x)x != x 更可读,也更安全(后者在某些 JIT 优化下可能被误判)
  • 如果业务允许 Infinity == Infinity,需单独判断:Double.isInfinite(a) && Double.isInfinite(b) && Math.signum(a) == Math.signum(b)

精度阈值本身不是魔法数字,它得和你的数据量级、计算路径长度、硬件平台都挂钩。同一个 epsilon 在单次加法和迭代 1000 次的累加器里,意义完全不同。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

597

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

108

2025.10.23

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

355

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

108

2025.10.23

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

3

2026.03.17

多环境下的 Nginx 安装、结构与运维实战
多环境下的 Nginx 安装、结构与运维实战

本专题聚焦多环境下Nginx实战,详解开发、测试及生产环境的差异化安装策略与目录结构规划。深入剖析配置模块化设计、灰度发布流程及跨环境同步机制。结合监控告警、故障排查与自动化运维工具,提供全链路管理方案,助力团队构建灵活、高可用的Nginx服务体系,从容应对复杂业务场景挑战。

0

2026.03.17

PS 批量添加图片
PS 批量添加图片

本专题整合了PS批量添加图片教程合集,阅读专题下面的文章了解更多详细操作。

2

2026.03.17

Nginx 基础架构:从安装配置到系统化管理
Nginx 基础架构:从安装配置到系统化管理

本专题深入解析Nginx基础架构,涵盖从源码编译与包管理安装,到核心配置文件优化及虚拟主机部署。进一步探讨日志轮转、性能调优、高可用集群构建及自动化运维策略,助力管理员实现从单一服务搭建到企业级系统化管理的全面升级,确保Web服务高效、稳定运行。

1

2026.03.17

mulerun骡子快跑入口地址汇总
mulerun骡子快跑入口地址汇总

本专题整合了mulerun入口地址合集,阅读专题下面的文章了解更多详细内容。

38

2026.03.17

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.6万人学习

Java 教程
Java 教程

共578课时 | 84.1万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号