您的位置:

Java绝对值函数详解

一、Math类中的abs()

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

Java中的Math类提供了abs()方法来获取一个数的绝对值。该函数有四个重载版本,分别支持int、long、float和double类型的参数。

对于int和long类型的参数,返回值是整数类型;对于float和double类型的参数,返回值是浮点数类型。下面是几个使用Math.abs()函数的示例:

int a = -5;
long b = -10L;
float c = 3.14f;
double d = -2.71828;

int absA = Math.abs(a);
long absB = Math.abs(b);
float absC = Math.abs(c);
double absD = Math.abs(d);

在上面的代码中,absA的值为5,absB的值为10,absC的值为3.14,absD的值为2.71828。

二、取模运算符实现绝对值

我们可以使用取模运算符实现绝对值函数,当然这种方法只适用于整数类型。具体做法是:如果输入的数是负数,就把它乘以-1,否则直接返回原数。下面是实现示例:

public static int abs(int a) {
    if (a < 0) {
        return -a;
    }
    return a;
}

我们可以对这段代码进行优化,来消除if语句:

public static int abs(int a) {
    int mask = a >> 31;
    return (a + mask) ^ mask;
}

三、Bitwise Tricks实现绝对值

使用位运算来实现绝对值函数,可以获得更高的效率。Bitwise Tricks的实现方式如下:

public static int abs(int a) {
    int mask = a >> 31;
    return (a ^ mask) - mask;
}

利用位运算实现绝对值函数比上一种方法快得多,因此被认为是最优解。由于实现方法过于繁琐,不建议在正式代码中使用。

四、Guava库中的Math函数

Google的开源Java库Guava也提供了绝对值函数的实现,该函数被定义在com.google.common.math.DoubleMath类中,其函数名为abs()。

double abs(double x)

与Java的Math.abs()函数不同,Guava的abs()函数只有一种重载版本,且只支持double类型的参数。下面是使用Guava的abs()函数的示例:

double x = -3.14159;
double absX = DoubleMath.abs(x);

五、BigInteger类中的abs()

Java中的BigInteger类也提供了一个abs()方法用于获取一个大整数的绝对值。

BigInteger abs()

该函数返回一个新的BigInteger类型对象,其值是输入参数的绝对值。下面是实例代码:

BigInteger a = new BigInteger("-123456789");
BigInteger absA = a.abs();

六、总结

本篇文章主要介绍了Java中取绝对值函数的几种实现方式,其中Java的Math类提供了最基础的实现方式。Bitwise Tricks是实现绝对值函数的最优解,但是使用过于繁琐。Guava库以及Java的BigInteger类也提供了对绝对值函数的支持。