1-0.99=?
下面我們來(lái)看一下代碼:
public static void main(String[] args) {
double a=1;
double b=0.99;
System.out.println(a-b);
}
真實(shí)的結(jié)果是0.010 00000 00000 00009。
解釋:
關(guān)于精度損失的原理可以很簡(jiǎn)單的講,首先一個(gè)正整數(shù)在計(jì)算機(jī)中表示使用01010形式表示的,浮點(diǎn)數(shù)也不例外。
比如11,11除以2等于5余1
5除以2等于2余1
2除以2等于1余0
1除以2等于0余1
所以11二進(jìn)制表示為:1011。
double類型占8個(gè)字節(jié),64位,第1位為符號(hào)位,后面11位是指數(shù)部分,剩余部分是有效數(shù)字。正整數(shù)除以2肯定會(huì)有個(gè)盡頭的,之后二進(jìn)制還原成十進(jìn)制只需要乘以2即可。
舉個(gè)例子:0.99用的有效數(shù)字部分,
0.99 * 2 = 1+0.98 --> 1
0.98 * 2 = 1+ 0.96 --> 1
0.96 * 2 = 1+0.92 -- >1
0.92 * 2 = 1+0.84 -- >1
...............
這樣周而復(fù)始是沒(méi)法有盡頭的,而double有效數(shù)字有限,所以必定會(huì)有損失,所以二進(jìn)制無(wú)法準(zhǔn)確表示0.99,就像十進(jìn)制無(wú)法準(zhǔn)確表示1/3一樣。