/** 只有当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();
}