<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      BigDecimal詳解

      1、BigDecimal基本介紹

      • 高精度數(shù)值計(jì)算:BigDecimal是 Java 中用于高精度數(shù)值計(jì)算的類。它主要用于處理需要精確表示的十進(jìn)制數(shù),特別是在金融、貨幣計(jì)算等對(duì)精度要求極高的領(lǐng)域。雙精度浮點(diǎn)型變量double 雖然可以處理16位有效數(shù),但在實(shí)際應(yīng)用中,可能需要對(duì)更大或者更小的數(shù)進(jìn)行運(yùn)算和處理,BigDecimal 就可以用來對(duì)超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算。一般情況下,對(duì)于那些不需要準(zhǔn)確計(jì)算精度的數(shù)字,我們可以直接使用Float和Double處理,但是Double.valueOf(String) 和Float.valueOf(String)會(huì)丟失精度。所以開發(fā)中,如果我們需要精確計(jì)算的結(jié)果,則必須使用BigDecimal類來操作。
      • 不可變對(duì)象:BigDecimal對(duì)象是不可變的,這意味著一旦創(chuàng)建,其數(shù)值就不能被修改。對(duì)BigDecimal對(duì)象進(jìn)行的任何操作(如加法、減法、乘法、除法等)都會(huì)返回一個(gè)新的BigDecimal對(duì)象,而原對(duì)象保持不變。這種不可變性有助于確保數(shù)據(jù)的一致性和線程安全性。

      當(dāng)程序中涉及到金額時(shí),必須使用 BigDecimal 而不是 double 或 float 。

       

      1.1、浮點(diǎn)類型坑示例

      public static void main(String[] args) {
          float a = 1;
          float b = 0.9f;
          System.out.println(a - b);
      }

       

      2、BigDecimal 的常用方法

      2.1、常用構(gòu)造方法

      • new BigDecimal(int val):創(chuàng)建一個(gè)具有參數(shù)所指定整數(shù)值的對(duì)象。
      • new BigDecimal(double val):(不推薦使用,因?yàn)榇嬖诰葋G失問題)創(chuàng)建一個(gè)具有參數(shù)所指定雙精度值的對(duì)象。
      • new BigDecimal(long val):創(chuàng)建一個(gè)具有參數(shù)所指定長整數(shù)值的對(duì)象
      • new BigDecimal(String val):(推薦使用)創(chuàng)建一個(gè)具有參數(shù)所指定以字符串表示的數(shù)值的對(duì)象。
      public static void main(String[] args) {
          BigDecimal b_int = new BigDecimal(10);
          BigDecimal b_double = new BigDecimal(0.1);
          BigDecimal b_float = new BigDecimal(0.1f);
          BigDecimal b_string = new BigDecimal("0.1");
          BigDecimal b_valueof = BigDecimal.valueOf(0.1);
      System.out.println(
      "b_int:" + b_int); System.out.println("b_double:" + b_double); System.out.println("b_float:" + b_float); System.out.println("b_string:" + b_string); System.out.println("b_valueof:" + b_valueof); }

      輸出如下:

      使用構(gòu)造函數(shù)時(shí),推薦用 int 或 String 做參數(shù),如果不滿足,則建議使用 BigDecimal.valueOf 方法,該方法可接受 int、long、double、float 做參數(shù),但注意不接受 String。

       

      2.2、常用方法

      注意:BigDecimal進(jìn)行運(yùn)算時(shí)必須要保證對(duì)象本身不能是null,否則就會(huì)拋空指針異常。

       

      1)加減乘除

      • add(BigDecimal):加,BigDecimal對(duì)象中的值相加,返回BigDecimal對(duì)象
      • subtract(BigDecimal):減,BigDecimal對(duì)象中的值相減,返回BigDecimal對(duì)象
      • multiply(BigDecimal):乘,BigDecimal對(duì)象中的值相乘,返回BigDecimal對(duì)象
      • divide(BigDecimal):除,BigDecimal對(duì)象中的值相除,返回BigDecimal對(duì)象。該方法可能會(huì)遇到無限精度問題,會(huì)拋出異常,使用時(shí)需注意。所以我們建議在使用BigDecimal進(jìn)行除運(yùn)算時(shí),一定要指定精度和舍入模式。
      public static void main(String[] args) {
          BigDecimal a = new BigDecimal("10");
          BigDecimal b = new BigDecimal("20");
          BigDecimal c = new BigDecimal("30");
      
          BigDecimal add = a.add(b);
          BigDecimal subtract = a.subtract(b);
          BigDecimal multiply = a.multiply(b);
          BigDecimal divide = a.divide(b);
      
          System.out.println("加結(jié)果為:" + add);
          System.out.println("減結(jié)果為:" + subtract);
          System.out.println("乘結(jié)果為:" + multiply);
          System.out.println("除結(jié)果為:" + divide);
      // 除不盡將會(huì)拋出異常 BigDecimal divide2 = a.divide(c); }

      輸入結(jié)果如下:

       

      其他常見方法:

      方法 含義
      abs() 將BigDecimal對(duì)象中的值轉(zhuǎn)換成絕對(duì)值
      doubleValue() 將BigDecimal對(duì)象中的值轉(zhuǎn)換成雙精度數(shù)
      floatValue() 將BigDecimal對(duì)象中的值轉(zhuǎn)換成單精度數(shù)
      longValue() 將BigDecimal對(duì)象中的值轉(zhuǎn)換成整數(shù)
      compareTo(BigDecimal val) 比較大小,返回int類型。0(相等) 1(大于) -1(小于)
      toPlainString() 推薦使用,直接轉(zhuǎn)換為字符串且不使用任何計(jì)數(shù)法
      toString() 轉(zhuǎn)換為字符串,但在必要時(shí)使用科學(xué)計(jì)數(shù)法。
      toEngineeringString() 轉(zhuǎn)換為字符串,但在必要時(shí)使用工程計(jì)數(shù)法。 工程記數(shù)法是一種工程計(jì)算中經(jīng)常使用的記錄數(shù)字的方法,與科學(xué)技術(shù)法類似,但要求10的冪必須是3的倍數(shù)
      max(BigDecimal val) 兩值比較,返回最大值
      negate() 求相反數(shù),正變負(fù),負(fù)變正
      pow(int n) 求乘方,如BigDecimal.valueOf(2).pow(3)的值為8

       

      3、設(shè)置精度和舍入模式

      BigDecimal 并不代表無限精度,當(dāng)在兩個(gè)數(shù)除不盡的時(shí)候,就會(huì)報(bào)錯(cuò)。所以我們建議在使用BigDecimal進(jìn)行除運(yùn)算時(shí),一定要指定精度和舍入模式。

      public static void main(String[] args) {
          BigDecimal b1 = new BigDecimal("1.0");
          BigDecimal b2 = new BigDecimal("3.0");
          // 保留3位小數(shù),且四舍五入
          BigDecimal divide = b1.divide(b2, 3, RoundingMode.HALF_UP);
          System.out.println(divide);//0.33
      }

       

      3.1、BigDecimal 中的舍入模式

      1. ROUND_UP(向上舍入)
        • 定義與行為:
          • 這種舍入模式總是在非零舍棄部分的左邊一位加 1。無論是正數(shù)還是負(fù)數(shù),只要有需要舍棄的非零部分,就會(huì)向上進(jìn)位。
        • 示例:
          • 對(duì)于正數(shù),如將1.1舍入到整數(shù),按照ROUND_UP模式,結(jié)果是2。因?yàn)樾?shù)部分0.1是非零的,所以將整數(shù)部分11得到2
          • 對(duì)于負(fù)數(shù),如將-1.1舍入到整數(shù),結(jié)果是-2。因?yàn)樾?shù)部分0.1是非零的,所以將整數(shù)部分-11得到-2
      2. ROUND_DOWN(向下舍入)
        • 定義與行為:
          • 總是舍棄非零舍棄部分,無論正數(shù)還是負(fù)數(shù),都不進(jìn)行進(jìn)位操作。
        • 示例:
          • 對(duì)于正數(shù),如將1.9舍入到整數(shù),按照ROUND_DOWN模式,結(jié)果是1,因?yàn)橹苯由釛壭?shù)部分0.9
          • 對(duì)于負(fù)數(shù),如將-1.9舍入到整數(shù),結(jié)果是-1。同樣是直接舍棄小數(shù)部分0.9
      3. ROUND_CEILING(天花板舍入)
        • 定義與行為:
          • 如果是正數(shù),行為類似于ROUND_UP;如果是負(fù)數(shù),行為類似于ROUND_DOWN。其目的是將數(shù)字舍入到正無窮方向。
        • 示例:
          • 對(duì)于正數(shù),如將1.1舍入到整數(shù),結(jié)果是2,和ROUND_UP模式相同。
          • 對(duì)于負(fù)數(shù),如將-1.1舍入到整數(shù),結(jié)果是-1,和ROUND_DOWN模式相同。
      4. ROUND_FLOOR(地板舍入)
        • 定義與行為:
          • 如果是正數(shù),行為類似于ROUND_DOWN;如果是負(fù)數(shù),行為類似于ROUND_UP。其目的是將數(shù)字舍入到負(fù)無窮方向。
        • 示例:
          • 對(duì)于正數(shù),如將1.9舍入到整數(shù),結(jié)果是1,和ROUND_DOWN模式相同。
          • 對(duì)于負(fù)數(shù),如將-1.9舍入到整數(shù),結(jié)果是-2,和ROUND_UP模式相同。
      5. ROUND_HALF_UP(四舍五入)
        • 定義與行為:
          • 如果舍棄部分大于或等于0.5,則在非零舍棄部分的左邊一位加1;否則,直接舍棄。這是最常見的舍入模式,符合我們?nèi)粘5?“四舍五入” 概念。
        • 示例:
          • 1.5舍入到整數(shù),結(jié)果是2,因?yàn)樾?shù)部分0.5滿足大于或等于0.5的條件,所以將整數(shù)部分11
          • 1.4舍入到整數(shù),結(jié)果是1,因?yàn)樾?shù)部分0.4小于0.5,所以直接舍棄。
      6. ROUND_HALF_DOWN(五舍六入)
        • 定義與行為:
          • 如果舍棄部分大于0.5,則在非零舍棄部分的左邊一位加1;否則,直接舍棄。與ROUND_HALF_UP的區(qū)別在于,當(dāng)舍棄部分等于0.5時(shí),不進(jìn)位。
        • 示例:
          • 1.5舍入到整數(shù),結(jié)果是1,因?yàn)樾?shù)部分等于0.5,不進(jìn)位。
          • 1.6舍入到整數(shù),結(jié)果是2,因?yàn)樾?shù)部分0.6大于0.5,所以將整數(shù)部分11
      7. ROUND_HALF_EVEN(銀行家舍入)
        • 定義與行為:
          • 也稱為 “銀行家舍入”。如果舍棄部分左邊的數(shù)字是偶數(shù),且舍棄部分等于0.5,則直接舍棄;如果舍棄部分左邊的數(shù)字是奇數(shù),且舍棄部分等于0.5,則在非零舍棄部分的左邊一位加1。對(duì)于其他情況,和ROUND_HALF_UP類似。
        • 示例:
          • 2.5舍入到整數(shù),結(jié)果是2,因?yàn)檎麛?shù)部分2是偶數(shù),且小數(shù)部分是0.5,所以直接舍棄。
          • 3.5舍入到整數(shù),結(jié)果是4,因?yàn)檎麛?shù)部分3是奇數(shù),且小數(shù)部分是0.5,所以將整數(shù)部分31

       

       

      9、最佳實(shí)踐

      public static void main(String[] args) {
          // 使用字符串參數(shù)構(gòu)造函數(shù)
          BigDecimal a = new BigDecimal("10");
          // 或使用BigDecimal.valueOf方法
          BigDecimal b = BigDecimal.valueOf(30);
      
          BigDecimal add = a.add(b);
          BigDecimal subtract = a.subtract(b);
          BigDecimal multiply = a.multiply(b);
          //進(jìn)行除運(yùn)算時(shí),指定精度和舍入模式,避免除不盡導(dǎo)致報(bào)錯(cuò)
          BigDecimal divide = a.divide(b, 2, RoundingMode.HALF_UP);
      
          System.out.println("加結(jié)果為:" + add);
          System.out.println("減結(jié)果為:" + subtract);
          System.out.println("乘結(jié)果為:" + multiply);
          System.out.println("除結(jié)果為:" + divide);
      }

      輸出如下:

       

      posted @ 2025-01-09 17:23  wenxuehai  閱讀(1781)  評(píng)論(0)    收藏  舉報(bào)
      //右下角添加目錄
      主站蜘蛛池模板: 亚洲精品一区二区三天美| 亚洲欧美日韩综合久久久| 99国产午夜福利在线观看| 国产欧美综合在线观看第十页 | 色一情一乱一区二区三区码| 日韩精品欧美高清区| 亚洲日韩精品无码一区二区三区| 国产精品人妻系列21p| 伊人欧美在线| 国产高清视频一区二区三区| 92国产精品午夜福利免费| 国产色婷婷亚洲99精品小说| 亚洲无av在线中文字幕| 亚洲AV无码破坏版在线观看| 亚洲日韩国产二区无码| 久久午夜无码免费| 2021精品亚洲中文字幕| 成年无码av片完整版| 少妇熟女久久综合网色欲| 英山县| 国产精品偷乱一区二区三区| 精品国产中文字幕懂色| 共和县| 老司机精品影院一区二区三区| 国产成人麻豆亚洲综合无码精品| 中文字幕久久国产精品| 中文人妻AV高清一区二区| 国产精品久久精品| 亚洲AV成人片不卡无码| 国产精品国产精品无卡区| 婷婷色婷婷深深爱播五月| 日韩激情无码av一区二区| 亚洲第一狼人成人综合网| 久久人人97超碰精品| 国产精品小仙女自拍视频| 国产中文字幕一区二区| 免费观看又色又爽又黄的崩锅| 亚洲一区二区三区在线| 俄罗斯少妇性XXXX另类| 亚洲国产中文字幕精品| 日韩一区二区三区日韩精品|