Java的Math类用于实际数值处理,非数学学习;需自行处理NaN和无穷大;round、floor、ceil、rint行为各异,选错致结果偏移;sqrt比pow求根更优;三角函数以弧度为单位;Math.random()不适用于安全或高并发场景;所有方法static final,单元测试需策略抽离。
Java 的 Math 类不是用来“学数学”的,而是解决实际编码中绕不开的数值处理问题——四舍五入、取整、开方、三角计算、随机数生成等,都得靠它;但它不处理 NaN 或无穷大时的业务逻辑,这点必须自己兜底。
四舍五入和取整函数怎么选:round、floor、ceil、rint
它们行为差异明显,选错会导致结果偏移:
-
Math.round(double)实际是floor(x + 0.5),返回long;注意Math.round(-1.5)得-1(向正无穷方向舍入),不是“银行家舍入” -
Math.floor(double)总是向下取整(≤x 的最大整数),返回double;Math.floor(-1.2)→-2.0 -
Math.ceil(double)总是向上取整(≥x 的最小整数);Math.ceil(1.2)→2.0 -
Math.rint(double)向最近的偶数取整(IEEE 754 规则),Math.rint(2.5)和Math.rint(3.5)都返回2.0和4.0
常见错误:用 round 处理金额四舍五入——它返回 long,且对负数行为不符合财务习惯;应改用 BigDecimal 或手动加 0.5 再 floor。
开方、幂运算和对数:别直接用 Math.pow(x, 0.5) 求平方根
Math.sqrt(double) 是专用优化实现,比 Math.pow(x, 0.5) 更快、更准,且对边界值(如 Double.POSITIVE_INFINITY、0.0)行为明确。
立即学习“Java免费学习笔记(深入)”;