在Python中(其他語(yǔ)言中也存在這個(gè)問(wèn)題,這是計(jì)算機(jī)采用二進(jìn)制導(dǎo)致的)攻臀,有時(shí)候由于二進(jìn)制和十進(jìn)制之間對(duì)應(yīng)問(wèn)題會(huì)導(dǎo)致數(shù)值的精度問(wèn)題踱阿,比如無(wú)法用有限個(gè)二進(jìn)制位完整地表示0.1透罢,因?yàn)?.1轉(zhuǎn)化為二進(jìn)制之后位一個(gè)無(wú)限循環(huán)小數(shù)。如下圖所示:
>>>1.1*2.2
2.4200000000000004
而
>>>print 1.1*2.2
2.42
這說(shuō)明Python內(nèi)部在將float類(lèi)型轉(zhuǎn)換為字符串時(shí)做了一些檢測(cè)虏肾,從而忽略了后邊的零廓啊。具體的實(shí)現(xiàn)原理還有待繼續(xù)探究。在CodeWar的Caculator題目中封豪,本來(lái)使用eval()函數(shù)就能極好地解決這道題谴轮,然而由于精度問(wèn)題導(dǎo)致無(wú)法通過(guò)Test,如下所示:
>>>eval('1.1*2.2*3.3')
7.986000000000001
經(jīng)過(guò)上面的提醒吹埠,改為
>>>float(str(eval('1.1*2.2*3.3')))
7.986
后成功解決問(wèn)題第步。
當(dāng)然具體的Python原理還需要具體探究。