javascript中toFixed使用的是银行家舍入规则。
据说大部分的编程软件都使用的是这种方法,也算是一种国际标准。所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。其规则是:当舍去位的数值小于5时,直接舍去该位;当舍去位的数值大于等于6时,在舍去该位的同时向前位进一;当舍去位的数值等于5时,如果前位数值为奇,则在舍去该位的同时向前位进一,如果前位数值为偶,则直接舍去该位。
可以用一下方案解决:
1 Number.prototype.toFixed = function(length) 2 { 3 var carry = 0; //存放进位标志 4 var num,multiple; //num为原浮点数放大multiple倍后的数,multiple为10的length次方 5 var str = this + ''; //将调用该方法的数字转为字符串 6 var dot = str.indexOf("."); //找到小数点的位置 7 if(str.substr(dot+length+1,1)>=5) carry=1; //找到要进行舍入的数的位置,手动判断是否大于等于5,满足条件进位标志置为1 8 multiple = Math.pow(10,length); //设置浮点数要扩大的倍数 9 num = Math.floor(this * multiple) + carry; //去掉舍入位后的所有数,然后加上我们的手动进位数 10 var result = num/multiple + ''; //将进位后的整数再缩小为原浮点数 11 /* 12 * 处理进位后无小数 13 */ 14 dot = result.indexOf("."); 15 if(dot < 0){ 16 result += '.'; 17 dot = result.indexOf("."); 18 } 19 /* 20 * 处理多次进位 21 */ 22 var len = result.length - (dot+1); 23 if(len < length){ 24 for(var i = 0; i < length - len; i++){ 25 result += 0; 26 } 27 } 28 return result; 29 }