BigDecimal 精度問題
在使用BigDecimal程序中,暫時遇到兩個問題,都是精度問題,一個是精度丟失,一個是精度顯示問題,
精度丟失
BigDecimal創建物件有很多種方式:

通過double型別去宣告bigdecimal物件時,就發生精度不準的問題
這個就不建議使用了,可以換種方式去解決這個問題,用string構造器構建物件:

設定好物件的精度大小也可以解決這個問題:

精度過長顯示科學計數法


這種顯示科學計數法的問題,主要產生原因有兩個:
1、小數點位數大于6;
2、只有最后一個小數非0,其他位都位0;
這種情況不會影響計算,只會影響顯示,列印日志等要用到toString方法的情況,
罪魁禍首是 Bigdecimal的ToString方法:
@Override
public String toString() {
String sc = stringCache;
if (sc == null)
stringCache = sc = layoutChars(true);
return sc;
}

只要宣告BigDecimal之后就有了stringCache這個屬性,debug從頭跟到尾沒有看到stringCache在哪里設定過,toString方法中恰恰使用了這個屬性,所以導致toString顯示的是科學計數法,
解決方案:
toPlainString方法就會顯示完整的數值,
public String toPlainString() {
if(scale==0) {
if(intCompact!=INFLATED) {
return Long.toString(intCompact);
} else {
return intVal.toString();
}
}
if(this.scale<0) { // No decimal point
if(signum()==0) {
return "0";
}
int tailingZeros = checkScaleNonZero((-(long)scale));
StringBuilder buf;
if(intCompact!=INFLATED) {
buf = new StringBuilder(20+tailingZeros);
buf.append(intCompact);
} else {
String str = intVal.toString();
buf = new StringBuilder(str.length()+tailingZeros);
buf.append(str);
}
for (int i = 0; i < tailingZeros; i++)
buf.append('0');
return buf.toString();
}
String str ;
if(intCompact!=INFLATED) {
str = Long.toString(Math.abs(intCompact));
} else {
str = intVal.abs().toString();
}
return getValueString(signum(), str, scale);
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/172474.html
標籤:其他
下一篇:蒙特卡洛樹搜索 MCTS 入門
