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