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

相关文章
相关标签/搜索