四舍六入五成雙
http://baike.baidu.com/view/1245064.htm?fr=aladdin
四舍六入五成雙是一種比較精確比較科學的計數保留法,是一種數字修約規則。
對於位數很多的近似數,當有效位數確定后,其后面多余的數字應該舍去,只保留有效數字最末一位,這種修約(舍入)規則是“四舍六入五成雙”,也即“4舍6入5湊偶”這里“四”是指≤4 時舍去,"六"是指≥6時進上,"五"指的是根據5后面的數字來定,當5后有數時,舍5入1;當5后無有效數字時,需要分兩種情況來講:①5前為奇數,舍5入1;②5前為偶數,舍5不進。(0是最小的偶數)
具體規則如下:
1. 被修約的數字等於或小於4時,該數字舍去;
2. 被修約的數字等於或大於6時,則進位;
3. 被修約的數字等於5時,要看5前面的數字,若是奇數則進位,若是偶數則將5舍掉,即修約后末尾數字都成為偶數;若5的后面還有不為“0”的任何數,則此時無論5的前面是奇數還是偶數,均應進位。
舉例,用上述規則對下列數據保留3位有效數字: 9.8249=9.82, 9.82671=9.83 9.8350=9.84, 9.8351 =9.84
PHP:
function round2($num,$precision){ $pow = pow(10,$precision); if( (floor($num * $pow * 10) % 5 == 0) && (floor( $num * $pow * 10) == $num * $pow * 10) && (floor($num * $pow) % 2 ==0) ){//舍去位為5 && 舍去位后無數字 && 舍去位前一位是偶數 =》 不進一 return floor($num * $pow)/$pow; }else{//四舍五入 return round($num,$precision); } } echo round2(3.504501,3);
JavaScript:
function round2(num,precision){ var dnum = Math.pow(10,precision); if(Math.floor(num*dnum*10)%5 == 0 && Math.floor(num*dnum*10) == num*dnum*10 && Math.floor(num*dnum)%2 == 0){ return Math.floor(num*dnum)/dnum; }else{ return Math.round(num,precision); } } alert(round2(3.504501,3));
From: http://blog.sina.com.cn/s/blog_47542995010144ro.html