1:加減乘除注意事項
運算時要注意結(jié)果的范圍,使用恰當(dāng)?shù)臄?shù)據(jù)類型冒滩。兩個正數(shù)都可以用int表示微驶,但相乘的結(jié)果可能就會超出,超出后結(jié)果會令人困惑灌曙,例如:
? ? ? ? int a = 2147483647*2; //2147483647是int能表示的最大值
a的結(jié)果是-2柑蛇。為什么是-2我們暫不解釋,要避免這種情況宛官,我們的結(jié)果類型應(yīng)使用long扶檐,但只改為long也是不夠的凶杖,因為運算還是默認按照int類型進行,需要將至少一個數(shù)據(jù)表示為long形式款筑,即在后面加L或l智蝠,下面這樣才會出現(xiàn)期望的結(jié)果:
? ? ? ? long a = 2147483647*2L;
另外,需要注意的是奈梳,整數(shù)相除不是四舍五入杈湾,而是直接舍去小數(shù)位,例如:
? ? ? ? double d = 10/4;
結(jié)果是2而不是2.5攘须,如果要按小數(shù)進行運算漆撞,需要將至少一個數(shù)表示為小數(shù)形式,或者使用強制類型轉(zhuǎn)化于宙,即在數(shù)字前面加(double)叫挟,表示將數(shù)字看作double類型,如下所示任意一種形式都可以:
? ? ? ? ? a) double d = 10/4.0;? ? ? ? ? b) double d = 10/(double)4;
2.小數(shù)計算結(jié)果不精確
無論是使用float還是double限煞,進行運算時都會出現(xiàn)一些非常令人困惑的現(xiàn)象,比如:
? ? ? ? ? float f = 0.1f*0.1f;? ? ? ? ? System.out.println(f);
這個結(jié)果看上去應(yīng)該是0.01员凝,但實際上署驻,屏幕輸出卻是0.010000001,后面多了個1健霹。換用double看看:
? ? ? ? ? double d = 0.1*0.1;? ? ? ? ? System.out.println(d);
屏幕輸出0.010000000000000002旺上,一連串的0之后多了個2,結(jié)果也不精確糖埋。
這是怎么回事宣吱?看上去這么簡單的運算,計算機計算的結(jié)果怎么不精確呢瞳别?但事實就是這樣征候,究其原因,我們需要理解float和double的二進制表示祟敛。
3.自增(++)/自減(--)
自增/自減是對自己做加1或減1操作疤坝,但每個都有兩種形式,一種是放在變量后馆铁,例如a++跑揉、a--,另一種是放在變量前,例如++a历谍、--a现拒。
如果只是對自己操作,這兩種形式也沒什么差別望侈,區(qū)別在于還有其他操作的時候印蔬。放在變量后(a++)是先用原來的值進行其他操作,然后再對自己做修改甜无,而放在變量前(++a)是先對自己做修改扛点,再用修改后的值進行其他操作。