日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在Java中,整數(shù)的絕對值竟然不一定是正數(shù)?。?!

絕對值是指一個數(shù)在數(shù)軸上所對應(yīng)點到原點的距離,所以,在數(shù)學(xué)領(lǐng)域,正數(shù)的絕對值是這個數(shù)本身,負(fù)數(shù)的絕對值應(yīng)該是他的相反數(shù)。

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)浦東,10多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

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

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

 
 
 
 
  1. public static int abs(int a) {  
  2.        return (a < 0) ? -a : a;  
  3.    }  
  4.    public static long abs(long a) {  
  5.        return (a < 0) ? -a : a;  
  6.    }  
  7.    public static float abs(float a) {  
  8.        return (a <= 0.0F) ? 0.0F - a : a;  
  9.    }  
  10.    public static double abs(double a) {  
  11.        return (a <= 0.0D) ? 0.0D - a : a;  
  12.    } 

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

所以,基于以上所有的知識,我們經(jīng)常會直接使用Math.abs來對一個數(shù)字取絕對值。

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

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

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

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

因為在極特殊情況下,上面的代碼會得到一個負(fù)數(shù)的值。

這個極特殊情況下就是當(dāng)hashCode是Integer.MIN_VALUE,即整數(shù)能表達(dá)的最小值的時候,可以代碼驗證下: 

 
 
 
 
  1. public static void main(String[] args) {  
  2.     System.out.println(Math.abs(Integer.MIN_VALUE));  

執(zhí)行以上代碼,得到的結(jié)果是: 

 
 
 
 
  1. -2147483648 

很明顯,這是個負(fù)數(shù)?。?!

為什么會這樣呢?

這要從Integer的取值范圍說起,int的取值范圍是-2^31 —— (2^31) - 1,即-2147483648 至 2147483647

那么,當(dāng)我們使用abs取絕對值時候,想要取得-2147483648的絕對值,那應(yīng)該是2147483648。

但是,2147483648大于了2147483647,即超過了int的取值范圍。這時候就會發(fā)生越界。

2147483647用二進(jìn)制的補(bǔ)碼表示是:

01111111 11111111 11111111 11111111 

這個數(shù) +1 得到:

10000000 00000000 00000000 00000000 

這個二進(jìn)制就是-2147483648的補(bǔ)碼。

雖然,這種情況發(fā)生的概率很低,只有當(dāng)要取絕對值的數(shù)字是-2147483648的時候,得到的數(shù)字還是個負(fù)數(shù)。

那么,如何解決這個問題呢?

既然是以為越界了導(dǎo)致最終結(jié)果變成負(fù)數(shù),那就解決越界的問題就行了,那就是在取絕對值之前,把這個int類型轉(zhuǎn)成long類型,這樣就不會出現(xiàn)越界了。

如,前面我們的分表邏輯修改為

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

就萬無一失了。

大家可以執(zhí)行下以下代碼: 

 
 
 
 
  1. public static void main(String[] args) {  
  2.       System.out.println(Math.abs((long)Integer.MIN_VALUE));  
  3.   } 

得到的結(jié)果就是:

 
 
 
 
  1. 2147483648 

以上,就是今天要介紹的知識點了。

但是,一定要記得,對long類型取絕對值其實也可能存在這個情況哦!只不過發(fā)生的概率就更低了,但是只要他存在,就有可能發(fā)生哦!


本文標(biāo)題:在Java中,整數(shù)的絕對值竟然不一定是正數(shù)?。?!
URL地址:http://www.5511xx.com/article/ccdeoch.html