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
請參考 GitHub 上的源碼代碼中 bigDecimalScientificNotation():方法
* 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());
}
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