HoRain云--Java数值处理:Number与Math全解析

🎬 HoRain云小助手:个人主页

🔥 个人专栏: 《Linux 系列教程》《c语言教程》

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

一、Number 类

为什么需要它?

核心抽象方法(所有子类必须实现)

典型子类要点

二、Math 类

常用方法速查

Math vs StrictMath

三、两者关系 & 选型建议


Java 里的Number​ 和Math​ 都位于java.lang包,是数值处理的两大基础,但定位完全不同——一个管"数值类型的抽象与装箱",一个管"数学运算工具"。


一、Number 类

java.lang.Number是一个抽象类,是所有数值包装类(Integer、Long、Double、Float、Byte、Short)以及BigDecimalBigInteger的父类。

为什么需要它?

Java 8 种基本类型里,数值类有 6 个(byte/short/int/long/float/double),它们不是对象,不能放进集合、不能调方法。Number 给它们套了一层父类,让"数值"也能当对象用(即装箱)。

// 子类举例 Integer i = 10; // extends Number Double d = 3.14; // extends Number BigDecimal bd = new BigDecimal("1.23"); // extends Number

核心抽象方法(所有子类必须实现)

int intValue(); long longValue(); float floatValue(); double doubleValue(); byte byteValue(); // 默认转 int 再强转 short shortValue(); // 默认转 int 再强转

用途:在不同数值类型之间转换(可能丢精度)。

Double d = 3.99; int x = d.intValue(); // 3,直接截断,不是四舍五入

典型子类要点

包装类

缓存范围

备注

Integer

-128 ~ 127

valueOf()走缓存

Long

-128 ~ 127

同上

Byte

全量缓存

就 256 个

Float/Double

无缓存

valueOf()直接 new

Integer a = 127; Integer b = 127; System.out.println(a == b); // true(缓存) Integer c = 128; Integer d = 128; System.out.println(c == d); // false(new 出来的) System.out.println(c.equals(d)); // true(比值,推荐)

💡 包装类比较值永远用equals,别用==


二、Math 类

java.lang.Mathfinal 工具类,构造器 private,所有方法都是static,拿来即用,不用 new。

public final class Math { private Math() {} // 防实例化 }

常用方法速查

基础运算

Math.abs(-5); // 5,绝对值 Math.max(3, 7); // 7 Math.min(3, 7); // 3 Math.pow(2, 10); // 1024.0(返回 double) Math.sqrt(9); // 3.0

取整三兄弟(最容易混)

Math.ceil(3.2); // 4.0 天花板,向上 Math.floor(3.8); // 3.0 地板,向下 Math.round(3.5); // 4 四舍五入(本质是 floor(x+0.5)) Math.round(-3.5); // -3 ⚠️ 不是 -4

随机数

Math.random(); // [0.0, 1.0) 的 double // 想要 [0, 10) 的整数: int n = (int)(Math.random() * 10);

生产代码更推荐ThreadLocalRandomRandomMath.random()内部同步,并发性能一般。

其他

Math.signum(-5); // -1.0(符号函数) Math.hypot(3, 4); // 5.0,√(x²+y²),防溢出写法 Math.log(10); // 自然对数 Math.PI; // π Math.E; // 自然常数

Math vs StrictMath

绝大多数场景用Math就够了。


三、两者关系 & 选型建议

// 反例 System.out.println(0.1 + 0.2); // 0.30000000000000004 ❌ // 正解 BigDecimal a = new BigDecimal("0.1"); BigDecimal b = new BigDecimal("0.2"); System.out.println(a.add(b)); // 0.3 ✅

要不要我接着展开BigDecimal的坑(scale / roundingMode / 构造器传 double 的陷阱),或者包装类自动拆装箱在集合里的真实表现?

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙