說(shuō)明:如果您有任何疑問(wèn)或想咨詢其他業(yè)務(wù)請(qǐng)撥打電話 400 685 0732
全網(wǎng)監(jiān)測(cè)海量數(shù)據(jù)按需發(fā)布監(jiān)測(cè)預(yù)警
實(shí)時(shí)把握輿情動(dòng)態(tài)精準(zhǔn)追溯信息源頭
double轉(zhuǎn)string java中double類型如何轉(zhuǎn)換為String類型
在我們做的項(xiàng)目中,有一個(gè)字符串的生成,我們需要double去拼接,結(jié)果發(fā)現(xiàn)了,拼接后的字符串,那個(gè)double值用科學(xué)計(jì)數(shù)法表示了,有用int試了一下,發(fā)現(xiàn)int不存在這個(gè)問(wèn)題,只有double和float包括各自的包裝類也有這個(gè)問(wèn)題,如何讓結(jié)果不出現(xiàn)科學(xué)計(jì)數(shù)法哪?
double轉(zhuǎn)string——java中double類型轉(zhuǎn)換為String類型
doublenum=1.0;
StringstrNum=Double.toString(num);
string類型顯示1.0
如果string類型顯示1怎么轉(zhuǎn)
doublenum=1.0時(shí)轉(zhuǎn)String類型為1
doublenum=1.1時(shí)轉(zhuǎn)String類型為1.1
關(guān)于java中Double類型的運(yùn)算精度問(wèn)題
在《EffectiveJava》這本書(shū)中也提到這個(gè)原則,float和double只能用來(lái)做科學(xué)計(jì)算或者是工程計(jì)算,在商業(yè)計(jì)算中我們要用java.math.BigDecimal。BigDecimal一共有4個(gè)夠造方法,我們不關(guān)心用BigInteger來(lái)夠造的那兩個(gè),那么還有兩個(gè),它們是:
BigDecimal(doubleval)
TranslatesadoubleintoaBigDecimal.
BigDecimal(Stringval)
TranslatestheStringrEPResentationofaBigDecimalintoaBigDecimal.
上面的API簡(jiǎn)要描述相當(dāng)?shù)拿鞔_,而且通常情況下,上面的那一個(gè)使用起來(lái)要方便一些。我們可能想都不想就用上了,會(huì)有什么問(wèn)題呢?等到出了問(wèn)題的時(shí)候,才發(fā)現(xiàn)上面哪個(gè)夠造方法的詳細(xì)說(shuō)明中有這么一段:
Note:theresultsofthisconstructorcanbesomewhatunpredictable.OnemightassumethatnewBigDecimal(.1)isexactlyequalto.1,butitisactuallyequalto.1000000000000000055511151231257827021181583404541015625.Thisissobecause.1cannotberepresentedexactlyasadouble(or,forthatmatter,asabinaryfractionofanyfinitelength).Thus,thelongvaluethatisbeingpassedintotheconstructorisnotexactlyequalto.1,appearancesnonwithstanding.
The(String)constructor,ontheotherhand,isperfectlypredictable:newBigDecimal(“.1”)isexactlyequalto.1,asonewouldexpect.Therefore,itisgenerallyrecommendedthatthe(String)constructorbeusedinpreferencetothisone
原來(lái)我們?nèi)绻枰_計(jì)算,非要用String來(lái)夠造BigDecimal不可!在《EffectiveJava》一書(shū)中的例子是用String來(lái)夠造BigDecimal的,但是書(shū)上卻沒(méi)有強(qiáng)調(diào)這一點(diǎn),這也許是一個(gè)小小的失誤吧。
解決方案
現(xiàn)在我們已經(jīng)可以解決這個(gè)問(wèn)題了,原則是使用BigDecimal并且一定要用String來(lái)夠造。
但是想像一下吧,如果我們要做一個(gè)加法運(yùn)算,需要先將兩個(gè)浮點(diǎn)數(shù)轉(zhuǎn)為String,然后夠造成BigDecimal,在其中一個(gè)上調(diào)用add方法,傳入另一個(gè)作為參數(shù),然后把運(yùn)算的結(jié)果(BigDecimal)再轉(zhuǎn)換為浮點(diǎn)數(shù)。你能夠忍受這么煩瑣的過(guò)程嗎?下面我們提供一個(gè)工具類Arith來(lái)簡(jiǎn)化操作。它提供以下靜態(tài)方法,包括加減乘除和四舍五入:
publicstaticdoubleadd(doublev1,doublev2)
publicstaticdoublesub(doublev1,doublev2)
publicstaticdoublemul(doublev1,doublev2)
publicstaticdoublediv(doublev1,doublev2)
publicstaticdoublediv(doublev1,doublev2,intscale)
publicstaticdoubleround(doublev,intscale)
Java中的簡(jiǎn)單浮點(diǎn)數(shù)類型float和double不能夠進(jìn)行運(yùn)算。不光是Java,在其它很多編程語(yǔ)言中也有這樣的問(wèn)題。在大多數(shù)情況下,計(jì)算的結(jié)果是準(zhǔn)確的,但是多試幾次(可以做一個(gè)循環(huán))就可以試出類似上面的錯(cuò)誤。現(xiàn)在終于理解為什么要有BCD碼了。如果大家還想了解更多與之有關(guān)的信息,歡迎關(guān)注我們文軍營(yíng)銷的官網(wǎng)。
推薦閱讀
說(shuō)明:如果您有任何疑問(wèn)或想咨詢其他業(yè)務(wù)請(qǐng)撥打電話 400 685 0732