當(dāng)前位置:首頁(yè)>職場(chǎng)>面試問(wèn)你用的什么數(shù)據(jù)庫(kù)(面試官問(wèn)我存儲(chǔ)金額應(yīng)該用哪種數(shù)據(jù)類(lèi)型)
發(fā)布時(shí)間:2024-01-24閱讀(18)

? 最近在面試時(shí),碰到這樣一個(gè)問(wèn)題:在問(wèn)到項(xiàng)目部分時(shí),面試官問(wèn)我:你的項(xiàng)目中用到的分?jǐn)?shù)、金額之類(lèi)的數(shù)字是用的什么數(shù)據(jù)類(lèi)型? 我沒(méi)有過(guò)多思考脫口而出:double!隨后面試官又問(wèn):為啥不用float?
? 聽(tīng)到這個(gè)問(wèn)題,腦子里竟然突然有些懵,回答道:double用著順手所以就用了,面試過(guò)后我自己在聽(tīng)錄音復(fù)盤(pán)時(shí)(遠(yuǎn)程線(xiàn)上面試)聽(tīng)到自己的回答不由得扶額苦笑,后面又對(duì)這一塊的內(nèi)容進(jìn)行了回顧加深。
double和float的區(qū)別float(單精度浮點(diǎn)數(shù))和double(雙精度浮點(diǎn)數(shù))的主要區(qū)別如下:
? 1)有效數(shù)字位數(shù)不同
? 單精度浮點(diǎn)數(shù)有效數(shù)字為8位
? 雙精度浮點(diǎn)數(shù)有效數(shù)字為16位
? 也就是說(shuō)因?yàn)橛行?shù)字位數(shù)不同,所以雙精度的double要比單精度的float要更精準(zhǔn)一些。
? 2)數(shù)值取值范圍不同
? 單精度浮點(diǎn)數(shù)的表示范圍:-3.40E 38~3.40E 38
? 雙精度浮點(diǎn)數(shù)的表示范圍:-1.79E 308~1.79E 308
? 3.40E 38的意思是3.4*10的38次方,而1.79E 308指的是1.79*10的308次方,所以double的取值范圍要遠(yuǎn)遠(yuǎn)大于float
? 3)內(nèi)存中占有的字節(jié)數(shù)不同
? 單精度浮點(diǎn)數(shù)在內(nèi)存中占4個(gè)字節(jié)
? 雙精度浮點(diǎn)數(shù)在內(nèi)存中占8個(gè)字節(jié)
? 也就是說(shuō)雙精度的double要比單精度的float更占內(nèi)存
? 4)在程序中的處理速度不同
? 一般來(lái)說(shuō),CPU處理單精度浮點(diǎn)數(shù)的速度比處理雙精度浮點(diǎn)數(shù)快
在程序中默認(rèn)小數(shù)為double類(lèi)型,所以如果要用float的話(huà),必須進(jìn)行強(qiáng)轉(zhuǎn)
public static void main(String[] args){float a = 1.1;}
比如我寫(xiě)了上面的代碼的話(huà),在程序中就會(huì)編譯報(bào)錯(cuò),正確的寫(xiě)法應(yīng)該為如下的代碼:
public static void main(String[] args){ float a = (float)1.1; float b = 1.1f;}
手動(dòng)強(qiáng)轉(zhuǎn)或者在小數(shù)后面加f表示為float類(lèi)型(f不區(qū)分大小寫(xiě))
在使用float時(shí)需要注意一點(diǎn):float 是8位有效數(shù)字,比如說(shuō)有如下代碼:
public static void main(String[] args){ float a = 1.11111111111f; System.out.println(a);}
最終的輸出結(jié)果為:1.1111112
這里有一個(gè)疑問(wèn),無(wú)論第九位是否大于5,在取值的時(shí)候都會(huì)向第八位進(jìn)1。
以上就是double和float的區(qū)別
金額到底應(yīng)該用哪種數(shù)據(jù)類(lèi)型?? 在總結(jié)double和float的區(qū)別時(shí),我發(fā)現(xiàn)在真實(shí)開(kāi)發(fā)中針對(duì)金額的存儲(chǔ)并非如我之前思考的一樣使用double或者float,為啥?讓我們看下面一段代碼:
public static void main(String[] args) { double a=0.03; double b=0.02; double c=a-b; System.out.println(c);}
? 對(duì)于這段代碼的執(zhí)行結(jié)果,大部分人可能會(huì)想肯定是0.01啊!但是運(yùn)行之后會(huì)驚奇的發(fā)現(xiàn)結(jié)果居然是0.009999999999999998,因?yàn)閒loat與double都是浮點(diǎn)數(shù),浮點(diǎn)數(shù)參與的運(yùn)算通常伴隨著因?yàn)闊o(wú)法精確表示而進(jìn)行的近似與舍入,所以導(dǎo)致結(jié)果會(huì)有一些偏差,而涉及到金額的計(jì)算是絕對(duì)不允許存在偏差的。
? 那么應(yīng)該怎么表示金額呢?
? 有兩種解決方案:第一種是存儲(chǔ)金額時(shí)以分或厘為單位存儲(chǔ)一個(gè)整數(shù),第二種是使用BigDecimal這種數(shù)據(jù)類(lèi)型來(lái)表示金額。
? 對(duì)于第一種是我目前在寫(xiě)項(xiàng)目時(shí)采用的,第二種暫時(shí)并未做嘗試。
總結(jié)面試官問(wèn)的小小的一個(gè)問(wèn)題竟然藏有這么多玄機(jī)和學(xué)問(wèn),不由得讓我汗顏,歸根結(jié)底還是自己的知識(shí)面不夠廣。不過(guò)這也算是面試中的一些小小收獲吧,能發(fā)現(xiàn)自己的不足并及時(shí)補(bǔ)足。
作者:喧嘩鏈接:https://juejin.im/post/5eb115456fb9a043383d6bb5
歡迎分享轉(zhuǎn)載→http://www.avcorse.com/read-220657.html
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號(hào)-5 TXT地圖HTML地圖XML地圖