接@justjavac大神的答案有個(gè)問題,Strings="0.12";調(diào)用Float.parseFloat(s);返回的結(jié)果偶爾會(huì)是0.1199按道理0.12float類型完全可以表示的啊這道理從何而來?憑空想象的吧計(jì)算機(jī)存儲(chǔ)任何數(shù)字都是基于二進(jìn)制,那么浮點(diǎn)數(shù)怎么存儲(chǔ)成二進(jìn)制?這里Java遵循了IEEE754標(biāo)準(zhǔn),大致過程如下十進(jìn)制數(shù)字轉(zhuǎn)化成二進(jìn)制表示形式,通過將整數(shù)部分除2取余、小數(shù)部分乘2取整來完成轉(zhuǎn)換0.12=>0.00011110101110000101000111101...//發(fā)現(xiàn)了么?十進(jìn)制的有窮小數(shù),在二進(jìn)制中,變成了無窮//只有小數(shù)部分*2^n==1的情況,用二進(jìn)制表示才是有窮的轉(zhuǎn)換成科學(xué)計(jì)數(shù)法(二進(jìn)制下),將小數(shù)點(diǎn)移動(dòng)到第一個(gè)1的右邊0.00011110101110000101000111101...=>1.1110101110000101000111101...*2^-4結(jié)果顯而易見了,轉(zhuǎn)換成IEEE754形式18位23位存不下了00111101111101011100001010001111(01...)+2的-4次冪除去整數(shù)部分1之后剩余的尾數(shù)0舍1入后忽略這部分,精度就這樣沒了當(dāng)你再從2進(jìn)制轉(zhuǎn)換回10進(jìn)制時(shí),失去的部分就回不來了1.1110.....1(?...)1*2^0+1*2^-1+1*2^-2+1*2^-3+0*2^-1+...+1*2^-23+???