在Java中,負數的絕對值竟然不一定是正數!!!

喝水會長肉發表於2021-12-14

絕對值是指一個數在數軸上所對應點到原點的距離,所以,在數學領域,正數的絕對值是這個數本身,負數的絕對值應該是他的相反數。

這幾乎是每個人都知道的。

在Java中,想要獲得有個數字的絕對值,可以使用 java.lang.Math中的 abs方法,這個類共有4個過載的abs方法,分別是:


public 
static int 
abs
(
int a
) 
{

    return (a < 0 ) ? -a : a ;
}

public static long abs ( long a ) {
    return (a < 0 ) ? -a : a ;
}
//java學習交流:737251827  進入可領取學習資源及對十年開發經驗大佬提問,免費解答!
public static float abs ( float a ) {
    return (a <= 0.0F ) ? 0.0F - a : a ;
}

public static double abs ( double a ) {
    return (a <= 0.0D ) ? 0.0D - a : a ;
}

以上4個方法分別返回int、long、float、double型別的絕對值,方法裡面的邏輯也簡單, 無非就是整數直接返回,負數取相反數返回

所以,基於以上所有的知識,我們經常會直接使用 Math.abs來對一個數字取絕對值。

在我們的程式碼中,也有很多這樣的例子。

比如,我們需要用訂單號做分庫分表,但是訂單號是字串型別,所以,我們就需要取得這個字元換的hashCode,因為 hashCode可能是負數,所以然後再對hashCode取絕對值,再用這個值去對分表數取模:

Math.abs(orderId.hashCode()) % 1024;

但是,上面這個邏輯是有問題的!!!

因為在極特殊情況下,上面的程式碼會得到一個負數的值。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2847678/,如需轉載,請註明出處,否則將追究法律責任。

相關文章