最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中負(fù)數(shù)的絕對值竟然不一定是正數(shù)

 更新時(shí)間:2021年07月29日 10:35:01   作者:Hollis Chuang  
這篇文章主要介紹了Java中負(fù)數(shù)的絕對值竟然不一定是正數(shù),文中給大家提到Java 中怎么把負(fù)數(shù)轉(zhuǎn)換為正數(shù),需要的朋友可以參考下

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

這幾乎是每個(gè)人都知道的。

在Java中,想要獲得有個(gè)數(shù)字的絕對值,可以使用java.lang.Math中的abs方法,這個(gè)類共有4個(gè)重載的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個(gè)方法分別返回int、long、float、double類型的絕對值,方法里面的邏輯也簡單,無非就是整數(shù)直接返回,負(fù)數(shù)取相反數(shù)返回。

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

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

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

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

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

因?yàn)樵跇O特殊情況下,上面的代碼會得到一個(gè)負(fù)數(shù)的值。

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

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

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

-2147483648

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

為什么會這樣呢?

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

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

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

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

01111111 11111111 11111111 11111111

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

10000000 00000000 00000000 00000000

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

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

那么,如何解決這個(gè)問題呢?

既然是以為越界了導(dǎo)致最終結(jié)果變成負(fù)數(shù),那就解決越界的問題就行了,那就是在取絕對值之前,把這個(gè)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

以上,就是今天要介紹的知識點(diǎn)了。

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

ps:下面看下Java 中怎么把負(fù)數(shù)轉(zhuǎn)換為正數(shù)?

要將負(fù)數(shù)轉(zhuǎn)換為正數(shù)(這稱為絕對值),請使用Math.abs()。此Math.abs()方法的工作方式如下:“number = (number < 0 ? -number : number);”。
看一個(gè)完整的例子:

package com.mkyong;
  
public class app{
   
  public static void main(String[] args) {
     
    int total =1 +1 +1 +1 + (-1);
     
    //output 3
    System.out.println("Total : " + total);
     
    int total2 =1 +1 +1 +1 + Math.abs(-1);
     
    //output 5
    System.out.println("Total 2 (absolute value) : " + total2);
     
  }
   
}

輸出量

Total :3
Total2 (absolute value) :5

在這種情況下,Math.abs(-1)會將負(fù)數(shù)1轉(zhuǎn)換為正數(shù)1?! ?/p>

到此這篇關(guān)于Java中負(fù)數(shù)的絕對值竟然不一定是正數(shù)的文章就介紹到這了,更多相關(guān)java負(fù)數(shù)絕對值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中Base64字符串出現(xiàn)不合法字符的問題解決

    java中Base64字符串出現(xiàn)不合法字符的問題解決

    非法的base64數(shù)據(jù)可能導(dǎo)致編碼或解碼過程出錯(cuò),本文主要介紹了java中Base64字符串出現(xiàn)不合法字符的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 關(guān)于ThreadLocal對request和response的用法說明

    關(guān)于ThreadLocal對request和response的用法說明

    這篇文章主要介紹了關(guān)于ThreadLocal對request和response的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 如何手寫一個(gè)Spring Boot Starter

    如何手寫一個(gè)Spring Boot Starter

    這篇文章主要介紹了如何手寫一個(gè)Spring Boot Starter,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Java實(shí)戰(zhàn)之網(wǎng)上書店管理系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之網(wǎng)上書店管理系統(tǒng)的實(shí)現(xiàn)

    本文將利用Java語言實(shí)現(xiàn)網(wǎng)上書店管理系統(tǒng)。其功能一般包括:圖書信息管理、用戶信息管理、圖書購買、圖書訂單查看、圖書添加、圖書維護(hù)等等,感興趣的可以了解一下
    2022-06-06
  • java中的正則操作方法總結(jié)

    java中的正則操作方法總結(jié)

    關(guān)于正則表達(dá)式的使用,更多的是自己的經(jīng)驗(yàn),有興趣可以參閱相關(guān)書籍。這里主要寫一下java中的正則操作方法
    2013-10-10
  • 解析Java中的默認(rèn)方法

    解析Java中的默認(rèn)方法

    這篇文章主要介紹了Java中的默認(rèn)方法,包括繼承和調(diào)用等Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-07-07
  • C++和Java命令行繪制心形圖案

    C++和Java命令行繪制心形圖案

    這篇文章主要為大家詳細(xì)介紹了C++和Java命令行繪制心形圖案,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 一文解析Java中的方法重寫

    一文解析Java中的方法重寫

    子類繼承父類后,可以在子類中書寫一個(gè)與父類同名同參的方法,從而實(shí)現(xiàn)對父類中同名同參數(shù)的方法的覆蓋,我們把這一過程叫做方法的重寫。本文將分析一下Java中的方法重寫,感興趣的可以了解一下
    2022-07-07
  • 解決mybatis plus 駝峰式命名規(guī)則問題

    解決mybatis plus 駝峰式命名規(guī)則問題

    這篇文章主要介紹了解決mybatis plus 駝峰式命名規(guī)則,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java線程本地變量導(dǎo)致的緩存問題解決方法

    Java線程本地變量導(dǎo)致的緩存問題解決方法

    使用緩存可以緩解大流量壓力,顯著提高程序的性能,我們在使用緩存系統(tǒng)時(shí),尤其是大并發(fā)情況下,經(jīng)常會遇到一些疑難雜癥,這篇文章主要給大家介紹了關(guān)于Java線程本地變量導(dǎo)致的緩存問題的解決方法,需要的朋友可以參考下,
    2024-08-08

最新評論

广灵县| 福泉市| 广河县| 会同县| 萨嘎县| 绵竹市| 理塘县| 莒南县| 项城市| 广河县| 名山县| 郓城县| 藁城市| 施甸县| 连州市| 高碑店市| 塔河县| 陈巴尔虎旗| 田林县| 盖州市| 松潘县| 屯留县| 海口市| 阳城县| 东兰县| 永昌县| 莱芜市| 水富县| 崇文区| 邵阳县| 霍林郭勒市| 板桥市| 新兴县| 略阳县| 昌黎县| 泰兴市| 灵武市| 湖口县| 勐海县| 察隅县| 根河市|