第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

java浮點(diǎn)數(shù)精度問題

java浮點(diǎn)數(shù)精度問題

梵蒂岡之花 2019-04-16 20:27:47
最近在做一個(gè)交易機(jī)器人,處理精度問題,發(fā)現(xiàn):Float.parseFloat(Strings);BigDecimal.floatValue();如上兩個(gè)方法都會(huì)產(chǎn)生精度丟失問題。那么浮點(diǎn)數(shù)只能用string才能精確表示嗎,真蛋疼。float和double類型不就多余了?
查看完整描述

1 回答

?
蝴蝶不菲

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊

接@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+???
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-16
  • 1 回答
  • 0 關(guān)注
  • 409 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)