Java中Math.abs()用法和Math.absExact() 用法

Java技术 潘老师 3周前 (01-31) 38 ℃ (0) 扫码查看

本文主要讲解Java中Math.abs()用法和Math.absExact() 用法。Java中的Math类包含执行常见数学运算的方法。处理绝对值的重要方法有两个:Math.abs()和Math.absExact()。本Java教程将探讨Math.abs()方法的绝对值、溢出和下溢问题,并介绍如何使用Math.absExact()解决这些问题。

1.什么是绝对值?

实数的绝对值,通常用|x|表示,是x的非负值,不考虑其符号。换句话说,它是该数在数轴上与零的距离。
这里有几个例子来解释这个概念:

  • ∣5∣=5 因为 5 是正数。
  • ∣−8∣=8 因为 -8 的绝对值是 8。
  • ∣0∣=0 因为 0 的绝对值是 0。

绝对值常用于计算或表示距离,例如海平面上的距离。无论是潜水员潜水还是登山者爬山,海平面上的距离始终是一个正数。

2.Java Math.abs() 函数

Math.abs()用于获取数值或表达式的绝对值。它接受int、long、float和double类型的参数。

public static double abs(double a)
public static float abs(float a)
public static int abs(int a)
public static long abs(long a)

例如,我们可以这样使用abs():

double doubleValue = -10.56;
float floatValue = -7.8f;
int intValue = -15;
long longValue = -123456789L;

System.out.println(STR."double绝对值: \{Math.abs(doubleValue)}");
System.out.println(STR."float绝对值: \{Math.abs(floatValue)}");
System.out.println(STR."int绝对值: \{Math.abs(intValue)}");
System.out.println(STR."long绝对值: \{Math.abs(longValue)}");

程序输出:

double绝对值: 10.56 float绝对值: 7.8 int绝对值: 15 long绝对值: 123456789 

3. 溢出/下溢问题

虽然Math.abs()本身不会直接导致溢出或下溢问题,但在处理大数值时,了解此函数的行为至关重要,因为它可能间接导致这类问题。
考虑以下程序:

int intMinValue = Integer.MIN_VALUE;
long longMinValue = Long.MIN_VALUE;

System.out.println(STR."int绝对值: \{Math.abs(intMinValue)}");  
System.out.println(STR."long绝对值: \{Math.abs(longMinValue)}");

程序输出:

int绝对值: -2147483648
long绝对值: -9223372036854775808

这结果就有问题。绝对值永远不应该是负值。在这些情况下,因为绝对值大于MAX_VALUE,从而导致了下溢问题。

如果我们不注意这些边界情况,程序中可能会出现意外的结果。

4.使用Math.absExact()防止溢出/下溢

从JDK 15开始,Math类增加了两个absExact()方法,一个用于int类型,另一个用于long类型。如果数学绝对值的结果容易超出int或long的边界,这些方法将抛出ArithmeticException,而不是返回误导性的结果。
让我们用absExact()方法重新运行之前的程序。

System.out.println(STR."int绝对值: \{Math.absExact(intMinValue)}");

Exception in thread "main" java.lang.ArithmeticException: Overflow to represent absolute value of Integer.MIN_VALUE
    at java.base/java.lang.Math.absExact(Math.java:1903)
    at com.howtodoinjava.core.basic.MathAbsoluteExamples.main(MathAbsoluteExamples.java:25)

对于非边界值,Math.abs()和Math.absExact()的工作方式类似。

如果你使用的Java版本低于15,可以自己编写边界情况的检查:

public static int absExact(int a) {

  if (a == Integer.MIN_VALUE)
      throw new ArithmeticException(
          "Overflow to represent absolute value of Integer.MIN_VALUE");
  else
      return abs(a);
}

5. 结论

从Java 15开始,建议在计算数字绝对值的地方使用Math.absExact()。这将自动防止溢出和下溢问题。在Java 15之前,请自行添加边界情况的检查。

如果你需要处理非常大的数字或需要任意精度,请考虑使用专门的类,如BigInteger或BigDecimal,这些类可以处理此类场景而不会发生溢出或下溢。

以上就是Java中Math.abs()用法和Math.absExact() 用法,希望对你有帮助,学习愉快!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/12835.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】