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