国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

            手機站
            千鋒教育

            千鋒學習站 | 隨時隨地免費學

            千鋒教育

            掃一掃進入千鋒手機站

            領取全套視頻
            千鋒教育

            關注千鋒學習站小程序
            隨時隨地免費學習課程

            當前位置:首頁  >  技術干貨  > 大數字處理相關的類有哪些?

            大數字處理相關的類有哪些?

            來源:千鋒教育
            發(fā)布人:zyh
            時間: 2023-06-13 17:15:00 1686647700

              全文大約【3800】字,不說廢話,只講可以讓你學到技術、明白原理的純干貨!本文帶有豐富的案例及配圖視頻,讓你更好地理解和運用文中的技術概念,并可以給你帶來具有足夠啟迪的思考......

            大數字處理相關的類有哪些

              一. BigInteger類

              1.簡介

              小編在之前給大家講解8種基本類型時就說過,不同的數據類型,有不同的取值范圍,我們再通過下表回顧一下:

            1683539185494.image

              從上表中我們可以看到,整型的最大取值范圍是-2^63 ~ 2^63-1,浮點型的最大取值范圍是±1.7E+308。但是不管這個范圍有多大,有些小伙伴就想杠一下,如果我就要存一個比Integer或Long更大的數字,怎么辦?

              針對這種大整數的需求,我們可以使用BigInteger,它的數字范圍比 Integer類型的數字范圍要大得多,而且BigInteger支持任意精度的整數。也就是說在運算中,BigInteger類型可以準確地表示任何大小的整數值。BigInteger和Integer、Long一樣都是Number的子類,屬于不可變類。它自身帶有一些可以進行運算的方法,包括基本的加、減、乘、除操作,還有很多較為高級的操作,像求絕對值、相反數、最大公約數及判斷是否為質數等,所以BigInteger用起來是比較方便的。

              2. 使用方法

              2.1 常用API方法

              如果我們要使用BigInteger類,首先要創(chuàng)建一個BigInteger對象。BigInteger類提供了多個構造方法,其中最直接的一個是以字符串作為參數的構造方法,即BigInteger(String val)。在創(chuàng)建BigInteger對象之后,我們就可以調用BigInteger類提供的方法,進行各種數學運算了,這些常用的API方法如下:

            1683539219274.image

              2.2 基本案例

              我們先來通過一個案例,來驗證一下BigInteger中的數字到底有多大。  

            public static void main(String[] args) {
            //創(chuàng)建一個BigInteger對象
            BigInteger bi = new BigInteger("1234567890");
            //計算1234567890的15次方,
            //結果=23589821655914838120947036369147203948318169938519404175968425823418008249115809912616071588527110255905622789563711716349000000000000000
            System.out.println(bi.pow(15));
            }

              我們會發(fā)現,BigInteger可以表示一個非常大的數字,比Integer、Long的范圍都要大。

              2.3 類型轉換

              小編在上面說過,BigInteger其實是Number的子類,我們知道,Number中定義了幾個負責類型轉換的方法,比如:

              ● 轉換為byte:byteValue()

              ● 轉換為short:shortValue()

              ● 轉換為int:intValue()

              ● 轉換為long:longValue()

              ● 轉換為float:floatValue()

              ● 轉換為double:doubleValue()

              我們利用上述幾個方法,就可以把BigInteger轉換成基本類型。但是大家要注意,如果BigInteger表示的范圍超過了基本類型的范圍,在轉換時會丟失高位信息,也就是說,結果不一定準確。所以如果我們需要準確地轉換成基本類型,可以使用intValueExact()、longValueExact()這樣的方法。不過這種方法在轉換時如果超出了基本類型的范圍,會直接拋出ArithmeticException異常。我們來驗證一下吧。  

            public static void main(String[] args) {
            //BigInteger轉基本類型
            BigInteger bi02 = new BigInteger("123456789000");
            //123456789000
            System.out.println("轉為int類型="+bi02.intValue());
            System.out.println("轉為float類型="+bi02.floatValue());
            System.out.println("轉為long類型="+bi02.longValue());

            //將123456789000乘以123456789000,然后將結果轉為long類型
            //java.lang.ArithmeticException: BigInteger out of long range
            System.out.println("得到精確結果="+bi02.multiply(bi02).longValueExact());
            }

              但是如果BigInteger的值超過了float的最大范圍(3.4x1038),結果并不會出現ArithmeticException異常,而是會出現Infinity,如下所示: 

            //計算999999的99次方,并得到該結果的float值
            BigInteger bi03 = new BigInteger("999999").pow(99);
            float f = bi03.floatValue();
            System.out.println("結果="+f);

              2.4 其他用法

              接下來我們再來看看其他的API方法都有哪些作用。  

            import java.math.BigInteger;
            import java.util.Scanner;

            public class Demo10 {

            public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("請輸入一個整數:");
            // 保存用戶輸入的數字
            int num = scanner.nextInt();

            // 使用輸入的數字創(chuàng)建BigInteger對象
            BigInteger bi = new BigInteger(num + "");
            // 計算大數字加上99的結果
            System.out.println("加法的結果:" + bi.add(new BigInteger("99")));
            // 計算大數字減去25的結果
            System.out.println("減法的結果:" + bi.subtract(new BigInteger("25")));
            // 計算大數字乘以3的結果
            System.out.println("乘法的結果:" + bi.multiply(new BigInteger("3")));
            // 計算大數字除以2的結果
            System.out.println("除法的結果:" + bi.divide(new BigInteger("2")));
            // 計算大數字除以3的商
            System.out.println("取商的結果:" + bi.divideAndRemainder(new BigInteger("3"))[0]);
            // 計算大數字除以3的余數
            System.out.println("取余的結果:" + bi.divideAndRemainder(new BigInteger("3"))[1]);
            // 計算大數字的4次方
            System.out.println("4次方的結果:" + bi.pow(4));
            // 計算大數字的相反數
            System.out.println("取反的結果:" + bi.negate());
            }

            }

              在上述案例中,我們將用戶輸入的數字作為 BigInteger 對象的參數,然后調用該對象的各種方法,實現了加、減、乘、除等運算,并輸出了最終的結果。

              二. BigDecimal類

              1.簡介

              雖然都是用于大數字運算的類,但BigDecimal加入了小數的概念,所以是可以操作小數的。而float 和 double類型,只能用來進行科學計算或工程計算,并不適用于精度要求較高的商業(yè)計算(如貨幣計算),所以要用到支持任何精度的BigDecimal類。該類中提供了一系列對應的方法,可以用來做超大浮點數的運算,像加、減、乘和除等。在所有運算中,除法運算是最復雜的,因為存在除不盡的情況,需要我們考慮末位小數的處理方式。

              2.使用方法

              2.1 常用構造方法

              以下是BigDecimal類的常用構造方法:

              ● BigDecimal(double val):實例化對象時可以將雙精度型轉換為BigDecimal類型;

              ● BigDecimal(String val):實例化對象時可以將字符串形式轉換為BigDecimal類型。

              2.2 常用API方法

              除了構造方法之外,BigDecimal還提供了一些常用的API方法供我們進行數學運算。這些方法與BigInteger的方法類型,很多方法名稱和用法也都與之一致,所以這里小編就不再一一列出了,接下來我就直接通過一個案例給大家演示這些方法如何使用。 

            import java.math.BigDecimal;

            public class Demo11 {

            public static void main(String[] args) {
            BigDecimal bd = new BigDecimal("1000.05800");
            // 計算大數字加上99的結果
            System.out.println("加法的結果:" + bd.add(new BigDecimal("99")));
            // 計算大數字減去25的結果
            System.out.println("減法的結果:" + bd.subtract(new BigDecimal("25")));
            // 計算大數字乘以1000的結果
            System.out.println("乘法的結果:" + bd.multiply(new BigDecimal(1000)));

            //獲取小數的位數,5
            System.out.println(bd.scale());

            //去掉BigDecimal末尾的0,返回一個與原有BigDecimal相等的新對象
            BigDecimal bd2 = bd.stripTrailingZeros();
            System.out.println(bd2.scale());
            }

            }

              在上述代碼中,stripTrailingZeros()方法用于去掉BigDecimal末尾的0,并返回一個與原有BigDecimal相等的新對象。而scale()方法用于獲取一個數字后面0的個數,如果返回的是負數,比如-2,則表示該數是一個整數,且末尾有2個0。

              2.3 divide()除法

              BigDecimal進行加、減、乘時,數字的精度不會丟失,但是進行除法運算時,有可能會出現無法除盡的情況,此時必須指定精度以及如何進行截斷。BigDecimal給我們提供了divide()和divideAndRemainder()兩個方法可以進行除法運算。

              其中,divide()方法有3個參數分別表示除數、商的小數點后的位數和近似值的處理模式,下表是小編給大家列出的roundingMode參數支持的處理模式。

            1683539368691.image  

            import java.math.BigDecimal;
            import java.math.RoundingMode;

            public class Demo12 {

            public static void main(String[] args) {
            BigDecimal d1 = new BigDecimal("123.456");
            BigDecimal d2 = new BigDecimal("123.456789");

            // 會產生ArithmeticException異常,因為除不盡,可以設置RoundingMode,按照指定的方法進行四舍五入或者直接截斷:
            //BigDecimal d3 = d1.divide(d2);

            // 保留10位小數并四舍五入
            BigDecimal d4 = d1.divide(d2, 10, RoundingMode.HALF_UP);
            System.out.println("d4="+d4);
            //按指定的位數直接截斷,0.xxxx
            BigDecimal d5 = d1.divide(d2, 4, RoundingMode.DOWN);
            System.out.println("d5="+d5);
            }
            }

               2.4 divideAndRemainder()除法

              而divideAndRemainder()方法,會返回一個數組,內部包含兩個BigDecimal,分別是商和余數,其中商總是整數,余數不會大于除數,所以我們可以利用這個方法來判斷兩個BigDecimal是否是整數倍數。 

            import java.math.BigDecimal;
            import java.math.RoundingMode;

            public class Demo12 {

            public static void main(String[] args) {
            //divideAndRemainder方法,返回一個數組,該數組內部包含了兩個BigDecimal,分別是商和余數,其中商總是整數,余數不會大于除數。
            //我們可以利用這個特性來判斷兩個BigDecimal是否是整數倍數。
            BigDecimal n = new BigDecimal("123.456");
            BigDecimal m = new BigDecimal("0.123");
            BigDecimal[] dr = n.divideAndRemainder(m);
            System.out.println(dr[0]); // 1003
            System.out.println(dr[1]); // 0.087

            if (dr[1].signum() == 0) {
            // n是m的整數倍
            System.out.println("n是m的整數倍");
            }else {
            System.out.println("n不是m的整數倍");
            }
            }
            }

              3.比較兩個BigDecimal

              如果我們想比較兩個BigDecimal的值是否相等,需要特別注意,請不要使用equals()方法,因為使用該方式進行比較時,不但要求兩個BigDecimal的值相等,還要求它們的scale()結果也相等。所以一般是建議使用compareTo()方法來比較,它會根據兩個值的大小分別返回負數、正數和0,分別表示小于、大于和等于。如下所示:  

            import java.math.BigDecimal;

            public class Demo13 {

            public static void main(String[] args) {
            BigDecimal d1 = new BigDecimal("123.456");
            BigDecimal d2 = new BigDecimal("123.456000");
            // false,因為scale不同
            System.out.println("d1==d2? "+d1.equals(d2));
            // true,因為d2去除尾部0后scale變?yōu)?
            System.out.println("d1==d2? "+d1.equals(d2.stripTrailingZeros()));
            //結果=0,負數表示小于,正數表示大于,0表示等于
            System.out.println("d1==d2? "+d1.compareTo(d2));
            }

            }

              之所以需要使用compareTo()方法來比較兩個BigDecimal的值才準確,這是因為一個BigDecimal實際上由一個BigInteger和一個scale組合而成的,其中BigInteger表示一個完整的整數,scale表示小數位數。如下圖所示:

            1683539432641.image

              compareTo()方法內部會對小數位數進行判斷,所以更準確,如下圖:

            1683539432641.image

              三. 結語

                至此,小編就把BigInteger、BigDecimal等大數字類介紹完畢了,最后給大家總結一下今天的重點內容:

              ● BigInteger用于表示任意大小的整數;

              ● BigInteger是不變類,并且繼承自Number;

              ● 將BigInteger轉換成基本類型時可使用longValueExact()等方法保證結果準確;

              ● BigDecimal用于表示精確的小數,常用于財務計算;

              ● 比較BigDecimal的值是否相等,必須使用compareTo()而不能使用equals()。

            聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
            10年以上業(yè)內強師集結,手把手帶你蛻變精英
            請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
            免費領取
            今日已有369人領取成功
            劉同學 138****2860 剛剛成功領取
            王同學 131****2015 剛剛成功領取
            張同學 133****4652 剛剛成功領取
            李同學 135****8607 剛剛成功領取
            楊同學 132****5667 剛剛成功領取
            岳同學 134****6652 剛剛成功領取
            梁同學 157****2950 剛剛成功領取
            劉同學 189****1015 剛剛成功領取
            張同學 155****4678 剛剛成功領取
            鄒同學 139****2907 剛剛成功領取
            董同學 138****2867 剛剛成功領取
            周同學 136****3602 剛剛成功領取
            相關推薦HOT