教會Scratch做四舍五入
? ? ? ? Scratch里沒有提供精確到小數(shù)點(diǎn)后幾位的代碼塊,導(dǎo)致在scratch里,保留小數(shù)位數(shù)時,往往會出現(xiàn)一大串的小數(shù)位,大概是17或18位,這完全不符合用戶的需求,于是干脆“一不做二不休”,自己用自定義模塊,寫了一個精確小數(shù)位數(shù)的自制代碼塊,基本上解決了難以準(zhǔn)確保留小數(shù)位數(shù)的“缺陷”吧。主要思路是:
? ? ? ? 一、先找出小數(shù)點(diǎn)的“位置”,例如小數(shù)36.8365,則小數(shù)點(diǎn)的位置在3,即第三個符號就是小數(shù)點(diǎn);再比如,3.1415926,小數(shù)點(diǎn)的位置就在2。
? ? ? ??二、接著根據(jù)實(shí)際需要精確的位數(shù),找出前該小數(shù)的前n個數(shù)字,比如小數(shù)3.1415926,想精確到3位小數(shù),那么在已經(jīng)找到小數(shù)點(diǎn)位置的前提下,再加3,即2+3=5,則找出前5個數(shù)字,包括小數(shù)點(diǎn)在內(nèi)。此時如果不需要四舍五入,那么就完成小數(shù)精確的任務(wù)。
? ? ? ??三、如果需要“五入”,那么還得多判斷保留位數(shù)的下一位是否大于4,還是上面這題,保留三位小數(shù)時,最后一位的1需要加1,因?yàn)樗南乱晃皇?,根據(jù)“五入”的要求,1要加1變2,才能符合要求。
? ? ? ??四、接下來的操作稍微復(fù)雜一些,要先把得到的小數(shù)變成整數(shù),比如先把3.141擴(kuò)大1000倍,變成3141,然后加1,變成3142,最后再縮小1000倍,變?yōu)?.142,最終完成“五入”。
? ? ? ??為何不在3.141時,直接加0.001變成3.142呢?我在測試時發(fā)現(xiàn),用小數(shù)直接進(jìn)行數(shù)學(xué)運(yùn)算時,大概率又會發(fā)生小數(shù)位變17位或18位的情況,不懂這是不是scratch的一個bug,因此后來想到的辦法,就是“舍近求遠(yuǎn)”,先擴(kuò)大倍數(shù),然后加1,再縮小相應(yīng)的倍數(shù)“還原”回來,如此一來,就不會出現(xiàn)位數(shù)變多的情況。
