原生JS实现四舍五入

在使用原有JS的 toFixed 实现 四舍五入时,如果位数过多,并且最后一位不为0时,四舍五入不准备,所以动手写了一个四舍五入的方法,经过2个阶段

1:正整数四舍五入

2:负数四舍五入

如果需要实现 四舍五入 ,只需要将下边的代码引入即可 

 1 //toFixed兼容方法,四舍五入
 2 Number.prototype.toFixed = function (len) {
 3     if (len > 20 || len < 0) {
 4         throw new RangeError('toFixed() digits argument must be between 0 and 20');
 5     }
 6     // .123转为0.123
 7     var number = Number(this);
 8     if (isNaN(number) || number >= Math.pow(10, 21)) {
 9         return number.toString();
10     }
11     if (typeof (len) == 'undefined' || len == 0) {
12         return (Math.round(number)).toString();
13     }
14     var result = number.toString(),
15         numberArr = result.split('.');
16 
17     if (numberArr.length < 2) {
18         //整数的情况
19         return padNum(result);
20     }
21     var intNum = numberArr[0], //整数部分
22         deciNum = numberArr[1],//小数部分
23         lastNum = deciNum.substr(len, 1);//最后一个数字
24 
25     if (deciNum.length == len) {
26         //需要截取的长度等于当前长度
27         return result;
28     }
29     if (deciNum.length < len) {
30         //需要截取的长度大于当前长度 1.3.toFixed(2)
31         return padNum(result)
32     }
33     //需要截取的长度小于当前长度,需要判断最后一位数字
34     result = intNum + '.' + deciNum.substr(0, len);
35     if (parseInt(lastNum, 10) >= 5) {
36         //最后一位数字大于5,要进位
37         var times = Math.pow(10, len); //需要放大的倍数
38         var changedInt = Number(result.replace('.', ''));//截取后转为整数
39         var fu = 1/changedInt < 0;// 为true 时,则 changedInt < 0 或者 changedInt = -0,否则为正数或等于0
40         if(fu){
41             changedInt--;//整数进位
42         }else{
43             changedInt++;//整数进位
44         }
45         changedInt /= times;//整数转为小数,注:有可能还是整数
46         result = padNum(changedInt + '');
47     }
48     return result;
49     //对数字末尾加0
50     function padNum(num) {
51         var dotPos = num.indexOf('.');
52         if (dotPos === -1) {
53             //整数的情况
54             num += '.';
55             for (var i = 0; i < len; i++) {
56                 num += '0';
57             }
58             return num;
59         } else {
60             //小数的情况
61             var need = len - (num.length - dotPos - 1);
62             for (var j = 0; j < need; j++) {
63                 num += '0';
64             }
65             return num;
66         }
67     }
68 }

 

posted on 2020-02-24 11:13  济世魔王  阅读(543)  评论(0编辑  收藏  举报

导航