float精度能保證6位有效,double保證15位有效。
一般認(rèn)為float轉(zhuǎn)double是不會(huì)丟失精度的,但是實(shí)際情況會(huì)丟失,如下代碼所示
出現(xiàn)這種結(jié)果的原因:讓一個(gè)float或double精確的表示0.1或者任何其他負(fù)數(shù)次方值是不可能的(十進(jìn)制系統(tǒng)中不能準(zhǔn)確的表示出1/3,同樣二進(jìn)制系統(tǒng)也不能準(zhǔn)確的表示1/10)。
1.十進(jìn)制整數(shù)轉(zhuǎn)為二進(jìn)制數(shù):
例子:11表示成二進(jìn)制數(shù):
11/2 =5 余1
5/2 = 2 余1
2/2 = 1 余0
1/2 = 0 余1
0結(jié)束,11二進(jìn)制表示為(從下往上):1011
注意:只要遇到除以后的結(jié)果為0就結(jié)束了。所有的整數(shù)除以2一定能夠最終得到0,但是小數(shù)就不能,小數(shù)轉(zhuǎn)變?yōu)槎M(jìn)制的算法就有可能會(huì)無(wú)限循環(huán)下去。
2.十進(jìn)制小數(shù)轉(zhuǎn)為二進(jìn)制數(shù)
算法是乘以2知道沒(méi)有了小數(shù)為止,例子:
0.9表示成二進(jìn)制數(shù):
0.9*2 = 1.8 取整數(shù)部分:1
0.8*2 = 1.6 取整數(shù)部分:1
0.6*2 = 1.2 取整數(shù):1
0.2*2 = 0.4 取整數(shù):0
0.4*2 = 0.8 取整數(shù):0
0.8*2 = 1.6 取整數(shù):1
0.9二進(jìn)制表示為(從上往下):1100100100100.......
注意:上面的計(jì)算過(guò)程循環(huán)了,也就是說(shuō)乘以2永遠(yuǎn)不能消滅小數(shù)部分,這樣算法將無(wú)限下去。顯然,小數(shù)的二進(jìn)制表示有時(shí)是不能精確的。道理很簡(jiǎn)單,十進(jìn)制系統(tǒng)中不能準(zhǔn)確的表示出1/3,同樣二進(jìn)制也無(wú)法準(zhǔn)確的表示1/10。這也是浮點(diǎn)型出現(xiàn)精度丟失問(wèn)題的主要原因。
解決方案一:
如果不介意記錄十進(jìn)制的小數(shù)點(diǎn),而且數(shù)值不大,那么可以使用long,int等基本類(lèi)型,
int resultInt = 10 -9;
double result = (double)resultInt / 100;//自己控制小數(shù)點(diǎn)
解決方案二:
使用BigDecimal,而且需要在構(gòu)造參數(shù)使用String類(lèi)型.
float和double只能用來(lái)做科學(xué)計(jì)算或者工程計(jì)算,在商業(yè)計(jì)算等精確計(jì)算中,要用java.math.BigDecimal。
首頁(yè) | 產(chǎn)品中心 | 新聞資訊 | 關(guān)于我們 | 在線留言 | 聯(lián)系我們
Copyright @ 2022 青島德瑞鑫凈化工程有限公司 . All rights reserved.