保留两位小数
把num修改为你要保留两位小数的变量即可。 想找方法的看完这个大标题即可,想知道原因的可以继续看大标题2。
向下取整
Math.floor(num* 100) / 100.
num = num.toFixed(2);
向上取整
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方法
Math.round()
可把一个数字舍入为最接近的整数,也就是我们意义上的四舍五入,但是它只能取整数部分。
因此我们可以将数字扩大两倍,使用round()
获得四舍五入得到的整数部分,然后再除100即可。
Math.round(num* 100) / 100.
但是这个方法也是有缺陷的,当待处理数字小数点后位数不够你要保留的位数的时候,就实效了,例如:3.1保留使用这个方法就只会显示3.1;100.00使用这个方法处理后就会变成100
如果要保留两位小数,这个就可以结合num = num.toFixed(2)
,这样可以有效防止上面提到的问题。
Math.round(num* 100) / 100.
num = num.toFixed(2);
既然能结合四舍五入,同理也就可以结合向上取整和向下取整了。
Math.floor(3.1415926 * 100) / 100; //3.14 向下取整
Math.ceil(3.1415926 * 100) / 100; //3.15 向上取整
Math.round(3.1415926 * 100) / 100; //3.14 四舍五入取整
但是要注意!!Math.round(x)
,它虽然不会产生精度问题,但是它有一点小陷阱容易忽略。
下面是它的舍入的策略:
- 如果小数部分大于 0.5,则舍入到下一个绝对值更大的整数。
- 如果小数部分小于 0.5,则舍入到下一个绝对值更小的整数。
- 如果小数部分等于 0.5,则舍入到下一个正无穷方向上的整数。
所以,对 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 + "";
};