BigDecimal.toString()采用科学计数法的条件

53 阅读1分钟

/** 只有当scale<0 和adjusted < -6时才采用E科学计数法. 说直接就下面两种情况: 1.直接科学计数法初始化BigDecimal: new BigDecimal("1E3"); 2.小数点后面大于等于6个零再加上非零数(至少是7位小数): new BigDecimal("0.0000001") **/ private String layoutChars(boolean sci) { if (scale == 0) // zero scale is trivial return (intCompact != INFLATED) ? Long.toString(intCompact): intVal.toString(); if (scale == 2 && intCompact >= 0 && intCompact < Integer.MAX_VALUE) { // currency fast path int lowInt = (int)intCompact % 100; int highInt = (int)intCompact / 100; return (Integer.toString(highInt) + '.' + StringBuilderHelper.DIGIT_TENS[lowInt] + StringBuilderHelper.DIGIT_ONES[lowInt]) ; }

    StringBuilderHelper sbHelper = threadLocalStringBuilderHelper.get();
    char[] coeff;
    int offset;  // offset is the starting index for coeff array
    // Get the significand as an absolute value
    if (intCompact != INFLATED) {
        offset = sbHelper.putIntCompact(Math.abs(intCompact));
        coeff  = sbHelper.getCompactCharArray();
    } else {
        offset = 0;
        coeff  = intVal.abs().toString().toCharArray();
    }


    StringBuilder buf = sbHelper.getStringBuilder();
    if (signum() < 0)             // prefix '-' if negative
        buf.append('-');
    int coeffLen = coeff.length - offset;
    long adjusted = -(long)scale + (coeffLen -1);
    if ((scale >= 0) && (adjusted >= -6)) { // plain number
        int pad = scale - coeffLen;         // count of padding zeros
        if (pad >= 0) {                     // 0.xxx form
            buf.append('0');
            buf.append('.');
            for (; pad>0; pad--) {
                buf.append('0');
            }
            buf.append(coeff, offset, coeffLen);
        } else {                         // xx.xx form
            buf.append(coeff, offset, -pad);
            buf.append('.');
            buf.append(coeff, -pad + offset, scale);
        }
    } else { // E-notation is needed       //开始采用科学计数法和工程计数法
        if (sci) {                       // Scientific notation
            //...省略非重点代码
        } else {                         // Engineering notation
            int sig = (int)(adjusted % 3);
            //...省略非重点代码
        }
        if (adjusted != 0) {             // [!sci could have made 0]
            buf.append('E');
            if (adjusted > 0)            // force sign for positive
                buf.append('+');
            buf.append(adjusted);
        }
    }
    return buf.toString();
}