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

在Java里Math类常用方法有哪些_Java数学工具类解析

阿萱吖_4514

阿萱吖_4514

发布时间:2026-01-28 11:43:36

|

1065人浏览过

|

来源于php中文网

原创

Math.abs()、Math.max()/min() 对负零、NaN、无穷大有特殊行为;Math.round() 非银行家舍入,仅加0.5后取整;Math.pow()/sqrt() 处理负数直接返回NaN;Math.random() 线程不安全且精度有限,推荐ThreadLocalRandom。

在java里math类常用方法有哪些_java数学工具类解析

Math.abs() 和 Math.max()/Math.min() 的边界行为要注意

负零、NaN、无穷大这些特殊值会让 Math.abs()、Math.max()、Math.min() 返回意料之外的结果。比如 Math.abs(-0.0) 返回 0.0(不是 -0.0),但 Math.abs(Double.NEGATIVE_INFINITY) 仍是 Double.POSITIVE_INFINITY;而 Math.max(1, Double.NaN) 直接返回 NaN,不会抛异常。

实际用时建议:

  • 对可能含 NaN 的数据,先用 Double.isNaN() 或 Float.isNaN() 过滤
  • 比较两个 double 值取较大者且需排除 NaN 时,别直接写 Math.max(a, b),改用三元表达式:a >= b ? a : b(前提是已确认非 NaN)
  • Math.min(Integer.MIN_VALUE, -Integer.MIN_VALUE) 会溢出成 Integer.MIN_VALUE,因为 -Integer.MIN_VALUE == Integer.MIN_VALUE

Math.round() 的“四舍六入五成双”不是真实现

很多人误以为 Math.round(double) 遵循银行家舍入(四舍六入五成双),其实它只是简单地加 0.5 后向下取整:(long)Math.floor(a + 0.5d)。所以 Math.round(2.5) 是 3,Math.round(3.5) 是 4,没有“看前一位奇偶”的逻辑。

需要真正银行家舍入时:

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

  • 用 BigDecimal:例如 new BigDecimal("2.5").setScale(0, RoundingMode.HALF_EVEN).intValue()
  • 避免对浮点数直接调用 Math.round() 做金融计算,二进制浮点误差会让 2.4999999999999996 被 round 成 2,而你本意是 3
  • Math.round(float) 返回 int,Math.round(double) 返回 long,类型不一致容易引发隐式转换 bug

Math.pow()、Math.sqrt() 对负数和精度的处理很直接

Math.pow(base, exponent) 在 base 且 <code>exponent 不是整数时返回 NaN,比如 Math.pow(-2, 0.5) 是 NaN(不是复数),Math.pow(-8, 1.0/3.0) 也返回 NaN,哪怕数学上等于 -2。

java后端编程
java后端编程

专用于 Java Spring Boot 后端开发的专业技能。当用户提出以下需求时,应调用此技能:构建 REST API、创建 Spring Boot 项目、编写 Java 后端服务、配置数据库访问(JPA / MyBatis)、处理认证与授权(Spring Security / JWT)、实现微服务架构(Spring Cloud)、排查 Spring Boot 相关错误、审查 Java 代码质量,或执行任何与 Spring Boot / Java 后端相关的任务。

下载

Math.sqrt(x) 对 x 一律返回 <code>NaN,对 0.0 和 -0.0 都返回 0.0。

性能与替代方案:

  • 求平方根优先用 Math.sqrt(x),它底层调用的是平台优化的 native 实现,比 Math.pow(x, 0.5) 快且更准
  • 整数平方根(如判断是否为完全平方数)别用 Math.sqrt(n) 再转 int 比较,易因浮点误差错判;改用二分或 long root = (long) Math.sqrt(n); if (root * root == n) {...} 并补校验
  • Math.pow(10, n) 计算数量级时,对大 n(如 n > 308)会溢出为 Infinity,注意检查

random() 和 nextInt() 的线程安全与范围陷阱

Math.random() 返回的是共享的 Random 实例,多线程高频调用会有竞争,虽不抛异常但可能降低吞吐。它只生成 [0.0, 1.0) 的 double,要生成 [a, b) 整数得手动缩放:(int)(Math.random() * (b - a) + a),但这个表达式在 b - a 很大时有精度丢失风险(double 只有 53 位有效位)。

更稳妥的做法:

  • 用 ThreadLocalRandom.current().nextInt(a, b) 替代,线程安全、无锁、支持闭区间语义(nextInt(a, b) 是 [a, b))
  • 需要可重现的随机序列时,绝不能用 Math.random(),它无法设置 seed;必须显式 new Random(seed)
  • Math.random() * Integer.MAX_VALUE 可能产生超过 int 范围的值,强制转 int 会截断,应先用 nextLong() 或限定范围再 cast
ThreadLocalRandom random = ThreadLocalRandom.current();
int dice = random.nextInt(1, 7); // [1, 7) → 1~6
long bigRand = random.nextLong(0L, 1_000_000_000_000L);

很多开发者卡在 Math 类的“看起来安全,实则藏坑”的细节上——比如用 Math.round() 处理金额、拿 Math.pow() 算负数开方、或者在并发场景下无脑调 Math.random()。这些方法本身没毛病,但 Java 的 Math 是严格按 IEEE 754 和 JDK 规范走的,不替你做业务假设。

热门AI工具

更多
WorkBuddy

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

SkildArt
SkildArt Hot

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

讯飞智作

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

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

豆包大模型

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

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

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

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

6787

2024.04.28

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

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

784

2025.10.23

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6599

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3205

2024.08.29

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

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

4128

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2825

2025.08.29

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

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

4128

2025.08.29

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

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

784

2025.10.23

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

40

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

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