絕對值是指一個數(shù)在數(shù)軸上所對應(yīng)點到原點的距離,所以,在數(shù)學(xué)領(lǐng)域,正數(shù)的絕對值是這個數(shù)本身 , 負數(shù)的絕對值應(yīng)該是他的相反數(shù) 。
這幾乎是每個人都知道的 。
在Java中,想要獲得有個數(shù)字的絕對值 , 可以使用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;}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類型的絕對值,方法里面的邏輯也簡單,無非就是整數(shù)直接返回,負數(shù)取相反數(shù)返回 。
所以,基于以上所有的知識,我們經(jīng)常會直接使用Math.abs來對一個數(shù)字取絕對值 。
在我們的代碼中 , 也有很多這樣的例子 。
比如 , 我們需要用訂單號做分庫分表 , 但是訂單號是字符串類型,所以,我們就需要取得這個字符換的hashCode , 因為hashCode可能是負數(shù) , 所以然后再對hashCode取絕對值 , 再用這個值去對分表數(shù)取模:
Math.abs(orderId.hashCode()) % 1024;但是,上面這個邏輯是有問題的?。。?
因為在極特殊情況下,上面的代碼會得到一個負數(shù)的值 。
這個極特殊情況下就是當hashCode是Integer.MIN_VALUE,即整數(shù)能表達的最小值的時候 , 可以代碼驗證下:
public static void main(String[] args) {System.out.println(Math.abs(Integer.MIN_VALUE));}執(zhí)行以上代碼 , 得到的結(jié)果是:
-2147483648很明顯,這是個負數(shù)?。。?
為什么會這樣呢?
這要從Integer的取值范圍說起,int的取值范圍是-2^31 —— (2^31) – 1,即-2147483648 至 2147483647
那么,當我們使用abs取絕對值時候,想要取得-2147483648的絕對值,那應(yīng)該是2147483648 。
但是,2147483648大于了2147483647,即超過了int的取值范圍 。這時候就會發(fā)生越界 。
2147483647用二進制的補碼表示是:
01111111 11111111 11111111 11111111
這個數(shù) +1 得到:
10000000 00000000 00000000 00000000
這個二進制就是-2147483648的補碼 。
雖然,這種情況發(fā)生的概率很低,只有當要取絕對值的數(shù)字是-2147483648的時候,得到的數(shù)字還是個負數(shù) 。
那么,如何解決這個問題呢?
既然是以為越界了導(dǎo)致最終結(jié)果變成負數(shù),那就解決越界的問題就行了,那就是在取絕對值之前,把這個int類型轉(zhuǎn)成long類型 , 這樣就不會出現(xiàn)越界了 。
如,前面我們的分表邏輯修改為
Math.abs((long)orderId.hashCode()) % 1024; 就萬無一失了 。
大家可以執(zhí)行下以下代碼:
public static void main(String[] args) {System.out.println(Math.abs((long)Integer.MIN_VALUE));}得到的結(jié)果就是:
2147483648以上,就是今天要介紹的知識點了 。
【絕對值函數(shù)的使用方法 java取絕對值函數(shù)】但是,一定要記得,對long類型取絕對值其實也可能存在這個情況哦!只不過發(fā)生的概率就更低了,但是只要他存在,就有可能發(fā)生哦!
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- Excel自動填充學(xué)號的便捷方法
- 解決OBS直播沒有聲音的問題
- 手把手教你做超好吃的甲魚湯 甲魚湯怎么做好喝又營養(yǎng)
- 制作金箔文字和邊框效果的Word封面
- 如何打造一個整潔有序的電腦桌面
- 不是錢的事 淄博燒烤店停業(yè)三天 老板:保命要緊
- 如何在WORD文檔中插入多行多列的表格
- 手機內(nèi)屏與外屏的區(qū)別
- 水煮肉片的做法 水煮肉片的家常做法
- 新解決Windows 10中javac未識別為內(nèi)部或外部命令的方法
