Java BigDecimal toString() 的轉換和輸出

  • 2020 年 2 月 26 日
  • 筆記

BigDecimal 的 toString() 方法將會把 BigDecimal 通過字元串的方式輸出。這個方法將會在必要的時候使用指數進行輸出。

具體的轉換步驟是按照下面的步驟進行轉換的:

BigDecimal的非標度值的絕對值用字元』0』到』9』,沒有被轉換為一個字元串基地10零(除非它的值是零,在這種情況下,一個單一的』0』字元被使用)。

接下來,計算調整的指數;這是無效的標度,加上字元的轉換的標度值,減1的次數。也就是說,-scale+(ulength-1),其中ulength是十進位數字(其精度)的非標度值的絕對值的長度。

如果該比例大於或等於零,並且調整的指數大於或等於-6,該號碼將被轉換為字元的形式,而無需使用指數表示法。

在這種情況下,如果該比例是零,則沒有小數點被添加和如果規模正小數點將被插入的規模指定的字元數的小數點的右邊。 『0』字元添加到轉換的非標度值的左側是必要的。如果前面沒有字元,小數點這個插入之後再傳統的』0』字元作為前綴。

否則(即,如果該比例是負的,或經調整的指數小於-6),該號碼將被採用指數表示法轉換為字元形式。在這種情況下,如果轉換後的BigInteger有一個以上的位小數點第一位數字後插入。

在字元形式的指數,然後後綴轉換非標度值(也許插入小數點);這包含字母「E」後面立刻被調整的指數轉換為字元形式。

後者的基數為十,使用字元』0』到』9』,沒有前導零,並且總是由前綴符號字元』 – 『(『 u002D』),如果調整後的指數為負數,否則為』+'(『 u002B』)。

『 – 『最後,整個字元串由一個減號字元的前綴(『 u002D』)如果非標度值小於零。如果非標度值為零或正數無符號字元作為前綴。

不使用科學計數法將 BigDecimal 轉換為 String

SRC

請參考 GitHub 上的源碼程式碼中 bigDecimalWithoutScientificNotationTest():方法

https://github.com/cwiki-us-demo/java-tutorials/blob/master/java-numbers/src/test/java/com/ossez/maths/BigDecimalDemoUnitTest.java

    /**       * To String without ScientificNotation       */      @Test      public void bigDecimalWithoutScientificNotationTest() {          String input = RandomStringUtils.randomNumeric(12)                  + "12345678901234567"                  + "8901234567890123"                  + "4567890123456789"                  + "0123456789012345"                  + "6789012345678901"                  + "2345678901234567"                  + "8901234567890123"                  + "4567890123456789"                  + "0123456789012345"                  + "6789012345678901"                  + "2345678901234567"                  + "8901234567890123"                  + "4567890123456789"                  + "0123456789012345"                  + "6789012345678901"                  + "2345678901234567"                  + "8901234567890123"                  + "4554324324362432"                  + "7674637264783264"                  + "7832678463726478"                  + "3264736274673864"                  + "7364732463546354"                  + "6354632564532645"                  + "6325463546536453"                  + "6546325463546534"                  + "6325465345326456"                  + "4635463263453264";          // Converting to BigDecimal          BigDecimal bigNumber = new BigDecimal(input);            // Apply toString() method          String numberStr = bigNumber.toString();            // Print the result          logger.info("{}", numberStr);      }

OUTPUT

程式最後的輸出如下,將會輸出轉換後的字元串。

2020/02/25 09:43:29.595 [main] INFO c.ossez.maths.BigDecimalDemoUnitTest - 1503277200971234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234554324324362432767463726478326478326784637264783264736274673864736473246354635463546325645326456325463546536453654632546354653463254653453264564635463263453264

使用科學計數法將 BigDecimal 轉換為 String

SRC

請參考 GitHub 上的源碼程式碼中 bigDecimalScientificNotation():方法

https://github.com/cwiki-us-demo/java-tutorials/blob/master/java-numbers/src/test/java/com/ossez/maths/BigDecimalDemoUnitTest.java

    /**       * To String with ScientificNotation       */      @Test      public void bigDecimalScientificNotation() {          // Create a BigDecimal object          BigDecimal bigNumber;            // Create a String object          String numberStr;            // Set precision to 5          MathContext mc = new MathContext(6);            bigNumber = new BigDecimal(RandomStringUtils.randomNumeric(10)+"E5", mc);            // apply toString() method          logger.info("{}", bigNumber.toString());          logger.info("{}", bigNumber.toEngineeringString());          logger.info("{}", bigNumber.toPlainString());      }

OUTPUT

程式最後的輸出如下,將會輸出轉換後的字元串。

2020/02/25 10:00:50.909 [main] INFO c.ossez.maths.BigDecimalDemoUnitTest - 8.31198E+14 2020/02/25 10:00:50.912 [main] INFO c.ossez.maths.BigDecimalDemoUnitTest - 831.198E+12 2020/02/25 10:00:50.912 [main] INFO c.ossez.maths.BigDecimalDemoUnitTest - 831198000000000

BigDecimal類有3個 toString 方法,分別是 toString()、 toEngineeringString() 、toPlainString().

從 BigDecimal 的注釋中可以看到這3個方法的區別:

  • toString() – 在必要的時候使用科學計數法
  • toEngineeringString() 在必要的時候使用工程計數法。類似於科學計數法,只不過指數的冪都是3的倍數,這樣方便工程上的應用,因為在很多單位轉換的時候都是10^3
  • toPlainString() – 不使用任何科學計數法。

不使用指數

科學計數法

工程計數法

2700

2.7 × 10³

2.7 × 10³

27000

2.7 × 10⁴

27 × 10³

270000

2.7 × 10⁵

270 × 10³

2700000

2.7 × 10⁶

2.7 × 10⁶

可以看到根據不同的輸出格式要求,BigDecimal 將會輸出不同格式的內容。這個就便於我們在後面的科學計算中進行轉換和輸出。

https://www.cwiki.us/pages/viewpage.action?pageId=57934181