BigDecimal的toString()、toPlainString()和toEngineeringString()區(qū)別及用法詳解
前言:
使用BigDecimal進(jìn)行打印的時(shí)候,經(jīng)常會(huì)對(duì)BigDecimal提供的三個(gè)toString方法感到好奇,以下整理3個(gè)toString方法的區(qū)別及用法。
方法及含義
以下內(nèi)容介紹java.math.BigDecimal下的三個(gè)toString方法的區(qū)別及用法
toPlainString() : 不使用任何指數(shù)。
toString() :有必要時(shí)使用科學(xué)計(jì)數(shù)法。
toEngineeringString():有必要時(shí)使用工程計(jì)數(shù)法。 工程記數(shù)法是一種工程計(jì)算中經(jīng)常使用的記錄數(shù)字的方法,與科學(xué)技術(shù)法類似,但要求10的冪必須是3的倍數(shù)
不使用指數(shù) | 科學(xué)記數(shù)法 | 工程記數(shù)法 |
---|---|---|
0.0001 | 0.0001 | 0.0001 |
0.0000001 | 1E-7 | 100E-9 |
toString()、toEngineeringString()方法在某些時(shí)候會(huì)使用科學(xué)計(jì)數(shù)法或工程計(jì)數(shù)法,不是所有情況都會(huì)使用科學(xué)計(jì)數(shù)法或工程計(jì)數(shù)法的
對(duì)于一個(gè)數(shù)值可能很小的BigDecimal對(duì)象來(lái)說(shuō),使用toString()可能由于打印的數(shù)值太小而打印其科學(xué)計(jì)數(shù)法表示,而使用toPlainString()才能打印完整的數(shù)值。
import java.math.BigDecimal; public class Test { public static void main(String[] args) { BigDecimal bg = new BigDecimal("1E11"); System.out.println(bg.toString()); // 1E+11 System.out.println(bg.toPlainString()); // 100000000000 System.out.println(bg.toEngineeringString()); // 100E+9 } }
執(zhí)行結(jié)果
1E+11
100000000000
100E+9
toString()與科學(xué)計(jì)數(shù)法
toString方法會(huì)將BigDecimal的值以科學(xué)計(jì)數(shù)方式的字符串,但是轉(zhuǎn)換成科學(xué)計(jì)數(shù)的方式也是有場(chǎng)景的,并不是所有的值都會(huì)轉(zhuǎn)為科學(xué)計(jì)數(shù)方式的字符串。
首先,任何一個(gè)BigDecimal都可以使用一個(gè)公式表示:
unscaledValue × 1 0 − s c a l e 10^{-scale} 10−scale
解釋一下:
unscaledValue :整數(shù)非標(biāo)度值 (即去掉小數(shù)點(diǎn)的Bigdecimal的值,類型為BigInteger)
scale:標(biāo)度值,如果為零或正數(shù),則標(biāo)度是小數(shù)點(diǎn)后的位數(shù)。如果為負(fù)數(shù),則將該數(shù)的非標(biāo)度值乘以 10 的負(fù) scale 次冪。
如下,BigDecimal值為123.00,則unscaledValue 為12300,而scale為2,套用公式,則數(shù)值是相等的。
public static void main(String[] args){ BigDecimal b = new BigDecimal("123.00"); System.out.println(b.scale()); System.out.println(b.unscaledValue()); }
執(zhí)行結(jié)果:
2
12300
我們看一下源碼中toString方法中給的example:
源碼中toString方法上有很長(zhǎng)的注釋,主要介紹指數(shù)計(jì)算轉(zhuǎn)換過(guò)程,簡(jiǎn)要總結(jié)了兩種toString()方法會(huì)以科學(xué)計(jì)數(shù)方式輸出的場(chǎng)景:
場(chǎng)景一:scale為負(fù)數(shù),一定會(huì)轉(zhuǎn)換為科學(xué)計(jì)數(shù)的方式
public static void main(String[] args) { BigDecimal a = new BigDecimal("2340").setScale(-1); System.out.println(a.toString()); System.out.println(a.toPlainString()); System.out.println(a.scale()); System.out.println(a.unscaledValue()); } //執(zhí)行結(jié)果 2.34E+3 2340 -1 234
場(chǎng)景二:
需要先計(jì)算變動(dòng)指數(shù)的值。公式為-scale+(unscaleValue.length-1) ,如果該值小于-6,那么則會(huì)使用科學(xué)計(jì)數(shù)的方式輸出字符串
public static void main(String[] args) { //案例一 BigDecimal b1 = new BigDecimal("0.000000123").setScale(9); System.out.println(b1.toString()); System.out.println(b1.toPlainString()); System.out.println(b1.scale()); System.out.println(b1.unscaledValue()); //輸出結(jié)果為 1.23E-7 0.000000123 9 123 //案例二 BigDecimal b2 = new BigDecimal("0.000001234").setScale(9); System.out.println(b2.toString()); System.out.println(b2.toPlainString()); System.out.println(b2.scale()); System.out.println(b2.unscaledValue()); //輸出結(jié)果為 0.000001234 0.000001234 9 1234 //案例三 BigDecimal b3 = new BigDecimal("0.123000000").setScale(9); System.out.println(b3.toString()); System.out.println(b3.toPlainString()); System.out.println(b3.scale()); System.out.println(b3.unscaledValue()); //輸出結(jié)果為 0.123000000 0.123000000 9 123000000 //案例四 BigDecimal b4 = new BigDecimal("123000000"); System.out.println(b4.toString()); System.out.println(b4.toPlainString()); System.out.println(b4.scale()); System.out.println(b4.unscaledValue()); //輸出結(jié)果為 123000000 123000000 0 123000000 //案例五 //Double d = 12345678d; Double d = 12345678.0; 效果一樣 Double d = (double) 12345678; BigDecimal b5 = BigDecimal.valueOf(d); System.out.println(d); System.out.println(b5.toString()); System.out.println(b5.toPlainString()); System.out.println(b5.scale()); System.out.println(b5.unscaledValue()); //輸出結(jié)果為 1.2345678E7 12345678 12345678 0 12345678 }
toEngineeringString()與工程計(jì)數(shù)法
Returns a string representation of this {@code BigDecimal}, using engineering notation if an exponent is needed. 返回此{(lán)@code BigDecimal}的字符串表示形式,如果需要指數(shù),則使用工程符號(hào)(即如果一個(gè)BigDecimal類型的參數(shù)toString()是以指數(shù)形式返回,那么調(diào)用toEngineeringString()則以工程計(jì)數(shù)法返回,工程計(jì)數(shù)法返回的10的冪必須是3的倍數(shù))
toPlainString()
不使用任何指數(shù),原值輸出為字符串
到此這篇關(guān)于BigDecimal的toString()、toPlainString()和toEngineeringString()區(qū)別及用法的文章就介紹到這了,更多相關(guān)BigDecimal的toString() toPlainString()和toEngineeringString()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java byte數(shù)組與16進(jìn)制間相互轉(zhuǎn)換的示例
這篇文章主要介紹了java byte數(shù)組與16進(jìn)制間相互轉(zhuǎn)換的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-10-10Maven配置單倉(cāng)庫(kù)與多倉(cāng)庫(kù)的實(shí)現(xiàn)(Nexus)
本文主要介紹了Maven配置單倉(cāng)庫(kù)與多倉(cāng)庫(kù)的實(shí)現(xiàn)(Nexus),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件 FTP連接管理模塊實(shí)現(xiàn)(8)
這篇文章主要為大家詳細(xì)介紹了Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件,F(xiàn)TP連接管理模塊的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04使用Apache Ignite實(shí)現(xiàn)Java數(shù)據(jù)網(wǎng)格
今天我們來(lái)探討如何使用Apache Ignite來(lái)實(shí)現(xiàn)Java數(shù)據(jù)網(wǎng)格,Apache Ignite是一個(gè)高性能的內(nèi)存計(jì)算平臺(tái),它提供了分布式緩存、數(shù)據(jù)網(wǎng)格和計(jì)算功能,可以顯著提高大規(guī)模應(yīng)用的數(shù)據(jù)處理性能,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-08-08Java異常處理 Throwable實(shí)現(xiàn)方法解析
這篇文章主要介紹了Java異常處理 Throwable實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10springboot?html調(diào)用js無(wú)效400問(wèn)題及解決
這篇文章主要介紹了springboot?html調(diào)用js無(wú)效400的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03在Windows系統(tǒng)下安裝Thrift的方法與使用講解
今天小編就為大家分享一篇關(guān)于在Windows系統(tǒng)下安裝Thrift的方法與使用講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12idea中javaweb的jsp頁(yè)面圖片加載不出來(lái)問(wèn)題及解決
這篇文章主要介紹了idea中javaweb的jsp頁(yè)面圖片加載不出來(lái)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07