四舍六入五考虑

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;
        }
    }
};

 

java 版本

public class SelfUtility {
    private final static NumberFormat NUMBERFORMAT = NumberFormat.getNumberInstance();
    public static String roundex(double val, int precision) {
        double ratio = Math.pow(10.0, (double) (precision));
        double x = val * ratio;
        long ival = (long) x;

        /*获取有效的小数*/
        double m1 = x - (double) ival;
        double m2 = m1 * 100.0;
        /*获取有效的小数之后的小数位*/
        int dm = (int) m2;
        double mod = Math.abs(((double) dm / 100));

        double result = 0.0;
        if (mod >= 0.6) {    /*六入*/
            result = (ival + (val >= 0 ? 1 : -1)) / ratio;
        } else if (mod < 0.5) {        /*四舍*/
            result = ival / ratio;
        } else {
            if (0.50 == mod) {        /*5后面一位数字如果等于0,又要分两种情况*/
                int f = (int) (ival % 10);/*获取个位值*/
                result = (0 == (f % 2) ? ival : ival + (val >= 0 ? 1 : -1)) / ratio;
            } else {        /*5后面一位的数字如果不等于0,则舍5进1*/
                result = (ival + (val >= 0 ? 1 : -1)) / ratio;
            }
        }
        NUMBERFORMAT.setMinimumFractionDigits(precision);
        return String.valueOf(NUMBERFORMAT.format(result));
    }

}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kmblack1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值