Java BigDecimal toString() 的轉換和輸出

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

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

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

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

若是該比例大於或等於零,而且調整的指數大於或等於-6,該號碼將被轉換爲字符的形式,而無需使用指數表示法。dom

在這種狀況下,若是該比例是零,則沒有小數點被添加和若是規模正小數點將被插入的規模指定的字符數的小數點的右邊。 ‘0’字符添加到轉換的非標度值的左側是必要的。若是前面沒有字符,小數點這個插入以後再傳統的’0’字符做爲前綴。spa

不然(即,若是該比例是負的,或經調整的指數小於-6),該號碼將被採用指數表示法轉換爲字符形式。在這種狀況下,若是轉換後的BigInteger有一個以上的位小數點第一位數字後插入。code

在字符形式的指數,而後後綴轉換非標度值(也許插入小數點);這包含字母「E」後面馬上被調整的指數轉換爲字符形式。blog

後者的基數爲十,使用字符’0’到’9’,沒有前導零,而且老是由前綴符號字符’ – ‘(‘ u002D’),若是調整後的指數爲負數,不然爲’+'(‘ u002B’)。ci

‘ – ‘最後,整個字符串由一個減號字符的前綴(‘ 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

相關文章
相關標籤/搜索