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)以及BigDecimal、BigInteger的父类。
为什么需要它?
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,直接截断,不是四舍五入典型子类要点
包装类 | 缓存范围 | 备注 |
|---|---|---|
| -128 ~ 127 |
|
| -128 ~ 127 | 同上 |
| 全量缓存 | 就 256 个 |
| 无缓存 |
|
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.Math是final 工具类,构造器 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);生产代码更推荐
ThreadLocalRandom或Random,Math.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:某些方法允许 JVM 用平台最优实现(如 x87 / SSE2),更快,但跨平台结果可能差最后一个 bitStrictMath:严格保证逐 bit 可移植,性能略差
绝大多数场景用Math就够了。
三、两者关系 & 选型建议
Number:当你需要把数值当对象——放集合、泛型、
Optional<Integer>、JSON 序列化 → 用包装类Math:做计算、取整、随机数 → 直接
Math.xxx()高精度(钱、金融)→
BigDecimal(也是 Number 子类),别用double算钱
// 反例 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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
