成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

在Java中,想要獲得有個數字的絕對值,可以使用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類型的絕對值,方法里面的邏輯也簡單,無非就是整數直接返回,負數取相反數返回。

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

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

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

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

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

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

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

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

執行以上代碼,得到的結果是: 

  1. -2147483648 

很明顯,這是個負數!!!

為什么會這樣呢?

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

那么,當我們使用abs取絕對值時候,想要取得-2147483648的絕對值,那應該是2147483648。

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

2147483647用二進制的補碼表示是:

01111111 11111111 11111111 11111111 

這個數 +1 得到:

10000000 00000000 00000000 00000000 

這個二進制就是-2147483648的補碼。

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

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

既然是以為越界了導致最終結果變成負數,那就解決越界的問題就行了,那就是在取絕對值之前,把這個int類型轉成long類型,這樣就不會出現越界了。

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

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

就萬無一失了。

大家可以執行下以下代碼: 

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

得到的結果就是:

  1. 2147483648 

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

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

 

責任編輯:龐桂玉 來源: Hollis
相關推薦

2009-11-25 09:20:31

Windows 7網絡掉線

2024-07-22 08:15:30

2021-06-18 10:29:17

物聯網安全互聯網IoT

2019-08-19 07:54:20

2021-01-19 21:45:09

PHP語言開發

2020-08-30 14:31:40

Python編程語言開發

2025-03-12 06:55:00

2016-10-17 18:00:46

WIFIWIFI信號

2021-02-26 09:04:22

數組ArrayListHashMap

2022-03-21 09:47:02

深度學習模型人工智能

2018-05-15 16:01:53

對象內存JVM

2022-08-15 13:59:10

XaaS云計算

2013-05-14 10:41:16

Palo AltoNGFWUTM

2010-11-17 11:11:44

跳槽

2021-01-29 09:17:00

深度學習AI人工智能

2018-01-18 05:20:59

2016-11-28 11:19:48

術語神秘

2022-12-26 09:16:45

Guava架構模型

2021-05-07 20:08:52

人工智能AI游戲

2021-05-08 16:33:14

人工智能游戲機器學習
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av毛片在线播放 | 日韩视频国产 | 欧美在线激情 | 欧美午夜视频 | 欧美激情一区二区 | 黄色激情毛片 | 97av视频在线| 麻豆一区二区三区精品视频 | 2018国产大陆天天弄 | 欧美特级黄色 | 欧美一区二区在线观看 | 国产精品一区在线观看 | 成人欧美一区二区三区黑人孕妇 | 久久久91精品国产一区二区精品 | 精品久久精品 | 久久久精品一区二区三区 | 欧美亚洲国产日韩 | 午夜视频免费在线 | 免费观看av网站 | 欧美午夜在线 | 亚洲精品视频在线播放 | 免费激情网站 | 日韩一区中文字幕 | 福利视频网站 | 天天操天天舔 | 国产成人精品一区二区 | 久久99精品久久久 | 污视频免费在线观看 | 欧美性久久久 | 狠狠干美女 | 在线国产一区 | 亚洲精品电影在线观看 | 伊人电影院av | 91精品在线观看入口 | 日韩av在线中文字幕 | 久久电影一区 | 高清一区二区三区 | 欧美精品三区 | 黄色国产视频 | 国产午夜精品一区二区三区嫩草 | 偷派自拍 |