关闭

四舍六入五考虑

391人阅读 评论(0) 收藏 举报
分类:

C版本(更正,请将long改成long long)

/*四舍六入五考虑
当有效位数后一位的数字≤4时,其后的数字直接舍去;
当有效位数后一位的数字≥6时,其后数字舍去并进1;
当有效位数后一位的数字=5时,要分两种情况:
5后面一位的数字如果不等于0,则舍5进1;
5后面一位数字如果等于0,又要分两种情况:
5的前面如果是奇数,则舍5进1;
5的前面如果是偶数,则舍5不进
*/
double roundex(double val, double precision){
	double ratio ( ::pow(10.0, precision) );
	double x(val * ratio);
	long longival (  (long long)x );

	/*获取有效的小数*/
	double m1( x -  (double)ival );
	double m2( m1 * 100 );
	long long dm((long long)m2);
	double mod ((double)dm / 100);

	if(mod >= 0.6 ){
		return (ival + 1)/ratio;
	}else if( mod < 0.5 ) {
		return ival/ratio;
	}else{
		if( 0.5 == mod  ){
			long long f( ival %10);/*获取个位值*/
			return ( 0 == (f % 2) ? ival : ival + 1) / ratio;
		}else{
			return (ival + 1) / ratio;
		}
	}
}
javascript版本

Number.prototype.roundex = function (precision) {
    var ratio = Math.pow(10, precision);
    var x = this * ratio;
    var ival = parseInt(x,10);
	
	/*获取有效的小数*/
	var m1 = x-ival;
	var m2 = m1 * 100.0;
	var dm = parseInt(m2,10);
	var mod = (dm / 100.0);
	
    if (mod >= 0.6) {                    /*6入 或者 当尾数为5,而尾数“5”的后面还有任何不是0的数字时,无论前一位在此时为奇数还是偶数,也无论“5”后面不为0的数字在哪一位上,都应向前进一位。*/
        return (ival + 1)/ratio;
    } else if (mod < 0.5) {          /*4舍*/
        return ival/ratio;
    } else {                                /*5考虑*/
        if (0.5 == mod) { /*当尾数为5,而尾数后面的数字均为0时,应看尾数“5”的前一位:若前一位数字此时为奇数,就应向前进一位;若前一位数字此时为偶数,则应将尾数舍去。数字“0”在此时应被视为偶数。*/
            var f = ival%10; /*获取5的前面的一位数字*/
			return ( 0 == (f % 2) ? ival : ival + 1) / ratio;
        } else {
            return (ival + 1) / ratio;
        }
    }
};


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:75746次
    • 积分:1227
    • 等级:
    • 排名:千里之外
    • 原创:40篇
    • 转载:3篇
    • 译文:0篇
    • 评论:10条
    文章分类
    最新评论