/**
功能:四舍五入数值
@author:qilb/2013-12-26
@param v----需四舍五入的值 ,n---小数点位保留位数
**/
function toDecimal(v,n) {
// 用正则表达式将前后空格
var val = v.replace(/[^\d\.-]/g, "");
var arr = val.split(".");
var sufFix = "";//后缀,小数后位数
var inBit = 0;//进位
var preFix = 0;//前缀
var i = 0;
if(arr.length<2){
i = n;//无小数位则直接补足零位数
}else{
sufFix = arr[1];
if(arr[1].length<n){
i = n-arr[1].length;//不足补零
}
}
while(i>0){
sufFix += "0";//不足补零
i--;
}
//处理小数后位数对进行进位操作
var _sufArr=sufFix.split("");
var _nSufFix= "";
if(n<_sufArr.length ){
for(var i=_sufArr.length-1;i>=0;i--){
if(i<n){
_nSufFix = (parseInt(_sufArr[i])+inBit)%10+_nSufFix;
if((parseInt(_sufArr[i])+inBit)>=10){
inBit = 1;//在位数内只有大于9才进位
}else{
inBit = 0;
}
}else if(n==i && (parseInt(_sufArr[i]))>=5){
inBit = 1;//多余位数,大于4则向上进位
}else{
inBit = 0;
}
}
}else{
_nSufFix += sufFix;
}
//处理小数点前整数
if(arr[0].indexOf("-")>-1){
if(parseInt(arr[0]) == 0){
preFix = "-"+(parseFloat(arr[0])+inBit);//负零点多要特别处理
}else{
preFix = parseFloat(arr[0])-inBit;//负数进位则是减去进位数
}
}else{
preFix = parseFloat(arr[0])+inBit; //正数则是加上进位数
}
if(n>0){//有保留位数
//return parseFloat(preFix+"."+_nSufFix); //返回Float小数 会自动省去小数后位0
return preFix+"."+_nSufFix; //返回字符串
}else{//无保留位数
return parseFloat(preFix)
}
}
今天公司同事做外汇项目需要对金额四舍五入,他网上找的一些方法或函数只针只能针对某个浏览器是可行的,换另外一种则就四舍五入结果错误,所以就抽点时间帮同事写了一个方法,经测试在现有浏览器上测试都是很可的。 由于水平有限不对的地方或有更好的方法,可以留言讨论。谢谢。