今天弄到j(luò)s計(jì)算成比例縮放功能,發(fā)現(xiàn)一有趣的問(wèn)題,我只要縮小了再放大就不可能回到原來(lái)的樣子(成比例的),細(xì)細(xì)研究發(fā)現(xiàn)js在計(jì)算147*1.1的時(shí)候結(jié)果居然為161.70000000000002!你把這個(gè)值賦給img后,img只接受整數(shù)也就是161,后面再去縮小乘0.9的時(shí)候?yàn)?44.9,偏差就很大了。縮小一次就偏3像素,無(wú)法接受。
js浮點(diǎn)誤差似乎稍微恐怖了點(diǎn),^_^
研究后的解決方法:把比例先乘10再把結(jié)果除10,不管小數(shù)點(diǎn)后面是幾都給整數(shù)上加1。每縮小一次都這樣執(zhí)行。
縮小同理,乘9最后再把結(jié)果除10,整數(shù)上加1,誤差會(huì)小很多。但不是沒(méi)有誤差,還是有的,相比之前小了很多很多而已,不知道哪位有沒(méi)有無(wú)誤差的方法,指點(diǎn)我一下。 呵呵 鉆死理了。
ps:
js的Math.ceil()方法可以取整,只要有小數(shù)位直接給整數(shù)位+1.
浮點(diǎn)數(shù)運(yùn)算的誤差原因:
很正常的,浮點(diǎn)數(shù)運(yùn)算的誤差。哪種語(yǔ)言都這樣,只是誤差大小不同而已。
用解析字符串的方式移動(dòng)小數(shù)點(diǎn),轉(zhuǎn)化為整數(shù),完畢后,在把小數(shù)點(diǎn)復(fù)位。
浮點(diǎn)數(shù)運(yùn)算的時(shí)候,先轉(zhuǎn)化為二進(jìn)制,用二進(jìn)制來(lái)算,結(jié)果再轉(zhuǎn)回十進(jìn)制
例如 :求1038.1-1000
1038.1=10000001110.0001100110011001100110011001100110011001100.....
1000= 1111101000
1038.1轉(zhuǎn)化為二進(jìn)制是個(gè)無(wú)限循環(huán)小數(shù),1100是循環(huán)節(jié),只能取近似值,誤差就是這里產(chǎn)生的
Tag標(biāo)簽: js計(jì)算,縮放