將BigDecimal轉(zhuǎn)成字符串為科學(xué)計(jì)數(shù)法的踩坑記錄
BigDecimal轉(zhuǎn)字符串為科學(xué)計(jì)數(shù)法踩坑
場(chǎng)景
在開(kāi)發(fā)工程中,在金額方面都會(huì)定義bigdecimal類型,當(dāng)然有時(shí)候也需要將金額轉(zhuǎn)成字符串。我們可能會(huì)很自然的寫成 金額.toString()方法如:
costBudgetEntity.getInitTotalAmount().toString()//獲取初始預(yù)算金額的字符串
當(dāng)然當(dāng)金額過(guò)小時(shí),轉(zhuǎn)成字符串,是沒(méi)有任何問(wèn)題的,但當(dāng)金額數(shù)值較大時(shí),轉(zhuǎn)成的字符串時(shí)科學(xué)計(jì)數(shù)法格式,這往往不是我們想要的格式。

因此
costBudgetEntity.getInitTotalAmount().toString()//金額為12000000輸出的結(jié)果為1.2E+7這種的字符串
然后根據(jù)這種字符串,無(wú)法做一些想要的業(yè)務(wù)處理
解決
查看BigDecimal的API后,得知有個(gè)toPlainString()方法, 此方法的返回類型為String ,它返回此BigDecimal對(duì)象的字符串表示形式,不需要任何指數(shù)。
/**
* Returns a string representation of this {@code BigDecimal}
* without an exponent field. For values with a positive scale,
* the number of digits to the right of the decimal point is used
* to indicate scale. For values with a zero or negative scale,
* the resulting string is generated as if the value were
* converted to a numerically equal value with zero scale and as
* if all the trailing zeros of the zero scale value were present
* in the result.
*
* The entire string is prefixed by a minus sign character '-'
* (<tt>'\u002D'</tt>) if the unscaled value is less than
* zero. No sign character is prefixed if the unscaled value is
* zero or positive.
*
* Note that if the result of this method is passed to the
* {@linkplain #BigDecimal(String) string constructor}, only the
* numerical value of this {@code BigDecimal} will necessarily be
* recovered; the representation of the new {@code BigDecimal}
* may have a different scale. In particular, if this
* {@code BigDecimal} has a negative scale, the string resulting
* from this method will have a scale of zero when processed by
* the string constructor.
*
* (This method behaves analogously to the {@code toString}
* method in 1.4 and earlier releases.)
*
* @return a string representation of this {@code BigDecimal}
* without an exponent field.
* @since 1.5
* @see #toString()
* @see #toEngineeringString()
*/
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);
}此時(shí),我們?cè)赿ebug查看:

costBudgetEntity.getInitTotalAmount().toPlainString() //金額為12000000輸出的結(jié)果為12000000字符串
案例演示

BigDecimal變科學(xué)計(jì)數(shù)法
阿里OTS存儲(chǔ)BigDecimal
當(dāng)BigDecimal數(shù)據(jù)大于9,999,999時(shí)
后就變成科學(xué)計(jì)數(shù)法了。
如10,000,000 就變?yōu)?.0E7
接收端應(yīng)該注意
也需要用BigDecimal,要是使用Integer接收,就可能出現(xiàn)異常
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot如何通過(guò)@Value,@ConfigurationProperties獲取配置
這篇文章主要介紹了springboot如何通過(guò)@Value,@ConfigurationProperties獲取配置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
自定義mybatis插件如何實(shí)現(xiàn)sql日志打印
這篇文章主要介紹了自定義mybatis插件如何實(shí)現(xiàn)sql日志打印問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
ssm項(xiàng)目改造spring?boot項(xiàng)目完整步驟
Spring?Boot現(xiàn)在已經(jīng)成為Java開(kāi)發(fā)領(lǐng)域的一顆璀璨明珠,它本身是包容萬(wàn)象的,可以跟各種技術(shù)集成,下面這篇文章主要給大家介紹了關(guān)于ssm項(xiàng)目改造spring?boot項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2023-04-04
復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn)
這篇文章主要介紹了復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot如何對(duì)LocalDateTime進(jìn)行格式化并解析
這篇文章主要介紹了SpringBoot如何對(duì)LocalDateTime進(jìn)行格式化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

