四舍六入五成雙銀行家算法的 PHP和Javascript實現


四舍六入五成雙

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM