Double類(lèi)是基本類(lèi)型double的包裝類(lèi),其中的主要屬性和方法與Float類(lèi)相似绘证。在本文中就不列出了,大家可以看下一起學(xué)JDK源碼 -- Float類(lèi)
基礎(chǔ)知識(shí):
1.浮點(diǎn)數(shù)的表示:
浮點(diǎn)數(shù)由三部分組成,符號(hào)位s、指數(shù)e和尾數(shù)f拌牲。
對(duì)于float表示如下
0 00000000 00000000000000000000000
sign(1bit) exponent(8bit) fraction(23bit) 共32bit
對(duì)于求值我們是有一個(gè)公式對(duì)應(yīng)的,某個(gè)浮點(diǎn)數(shù)的值為:
(?1)^s ? (1.f) ? 2^(e?127)
可以看到32位的最高位為符號(hào)標(biāo)識(shí)符歌粥,1表示負(fù)數(shù)塌忽,0表示正數(shù)。指數(shù)部分為8位阁吝,其實(shí)可以是0到255砚婆,但是為了可正可負(fù)械拍,這里需要減去127后才是真正的指數(shù)突勇,而底數(shù)固定為2。剩下的23位表示尾數(shù)坷虑,但默認(rèn)前面都會(huì)加上1.甲馋。所以通過(guò)上面就可以將一個(gè)浮點(diǎn)數(shù)表示出來(lái)了。
我們舉個(gè)例子來(lái)看迄损,二進(jìn)制的“01000001001101100000000000000000”表示的浮點(diǎn)數(shù)是啥定躏?
符號(hào)位為0,表示正數(shù)芹敌。
指數(shù)為“10000010”痊远,減去127后為3。
尾數(shù)對(duì)應(yīng)的值為“1.011011”氏捞。
于是最終得到浮點(diǎn)數(shù)為“1011.011”碧聪,轉(zhuǎn)成十進(jìn)制為“11.375”。
2.精度丟失:
對(duì)float或double 的使用不當(dāng)液茎,可能會(huì)出現(xiàn)精度丟失的問(wèn)題逞姿。浮點(diǎn)運(yùn)算很少是精確的辞嗡,只要是超過(guò)精度能表示的范圍就會(huì)產(chǎn)生誤差。往往產(chǎn)生誤差不是 因?yàn)閿?shù)的大小滞造,而是因?yàn)閿?shù)的精度续室。因此,產(chǎn)生的結(jié)果接近但不等于想要的結(jié)果谒养。尤其在使用 float 和 double 作精確運(yùn) 算的時(shí)候要特別小心挺狰。如:
System.out.println(0.1d + 0.2d);這個(gè)輸出的結(jié)果不是我們想要的0.3而是0.30000000000000004。這就是java中的精度丟失买窟∷剩可以使用如下方式解決:
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.2");
System.out.println(b1.add(b2));
所以大家在遇到金錢(qián)等對(duì)精度要求較高的業(yè)務(wù)時(shí)最好不要使用浮點(diǎn)類(lèi)型的數(shù)∶锼睿可以考慮使用BigDecimal趁耗。或是把單位轉(zhuǎn)換成分疆虚,這樣處理的數(shù)字都是整數(shù)苛败,最后再化成小數(shù)。這樣就不會(huì)出現(xiàn)精度丟失的問(wèn)題了径簿。