文章目录 保留两位小数向下取整向上取整四舍五入方法一方法二 为什么这么写才会生效?先说为什么不能只用.toFixed()Math.round方法重定义toFixed()
保留两位小数
把num修改为你要保留两位小数的变量即可。 想找方法的看完这个大标题即可,想知道原因的可以继续看大标题2。
向下取整写法一
Math.floor(num* 100) / 100.num = num.toFixed(2);写法二
Math.trunc(num* 100) / 100num = num.toFixed(2);注意这两个是有区别的!
Math.floor()是向下取整Math.trunc()是去除小数部分 向上取整 Math.ceil(num* 100) / 100.num = num.toFixed(2); 四舍五入 方法一 Math.round(num* 100) / 100.num = num.toFixed(2); 方法二 num = num.toFixed(2);//替换num即可,整一大段代码都需要写哦Number.prototype.toFixed = function(d) {var s = this + "";if(!d) d = 0;if(s.indexOf(".") == -1) s += ".";s += new Array(d + 1).join("0");if(new RegExp("^(-|\+)?(\d+(\.\d{0," + (d + 1) + "})?)\d*$").test(s)) {var s = "0" + RegExp.$2,pm = RegExp.$1,a = RegExp.$3.length,b = true;if(a == d + 2) {a = s.match(/d/g);if(parseInt(a[a.length - 1]) > 4) {for(var i = a.length - 2; i >= 0; i--) {a[i] = parseInt(a[i]) + 1;if(a[i] == 10) {a[i] = 0;b = i != 1;} else break;}}s = a.join("").replace(new RegExp("(\d+)(\d{" + d + "})\d$"), "$1.$2");}if(b) s = s.substr(1);return(pm + s).replace(/.$/, "");}return this + "";}; 为什么这么写才会生效? 先说为什么不能只用.toFixed()许多人会说用.toFixed()来四舍五入,但是.toFixed()使用的是银行家舍入法【百度百科】,但是银行家舍入法并不符合我们常理中的四舍五入,例如下图中四舍五入就翻车了。无法精确四舍五入是.toFixed()的缺陷,因此我们就要想办法处理掉他。
Math.round()可把一个数字舍入为最接近的整数,也就是我们意义上的四舍五入,但是它只能取整数部分。
因此我们可以将数字扩大两倍,使用round()获得四舍五入得到的整数部分,然后再除100即可。
但是这个方法也是有缺陷的,当待处理数字小数点后位数不够你要保留的位数的时候,就实效了,例如:3.1保留使用这个方法就只会显示3.1;100.00使用这个方法处理后就会变成100
如果要保留两位小数,这个就可以结合num = num.toFixed(2),这样可以有效防止上面提到的问题。
既然能结合四舍五入,同理也就可以结合向上取整和向下取整了。
但是要注意!!Math.round(x),它虽然不会产生精度问题,但是它有一点小陷阱容易忽略。
下面是它的舍入的策略:
所以,对 Math.round(-1.5),其结果为 -1,因此负数时要先转化为正数再处理。
重定义toFixed()由于toFixed()是银行家舍入法,是这个方法的缺陷,因此简单粗暴我们可以重新写一个toFixed(),代码如下,想直接使用toFixed()的时候,把这段代码复制进去即可。
Number.prototype.toFixed = function(d) {var s = this + "";if(!d) d = 0;if(s.indexOf(".") == -1) s += ".";s += new Array(d + 1).join("0");if(new RegExp("^(-|\+)?(\d+(\.\d{0," + (d + 1) + "})?)\d*$").test(s)) {var s = "0" + RegExp.$2,pm = RegExp.$1,a = RegExp.$3.length,b = true;if(a == d + 2) {a = s.match(/d/g);if(parseInt(a[a.length - 1]) > 4) {for(var i = a.length - 2; i >= 0; i--) {a[i] = parseInt(a[i]) + 1;if(a[i] == 10) {a[i] = 0;b = i != 1;} else break;}}s = a.join("").replace(new RegExp("(\d+)(\d{" + d + "})\d$"), "$1.$2");}if(b) s = s.substr(1);return(pm + s).replace(/.$/, "");}return this + "";};