JavaScript 保留两位小数 | 如何精确四舍五入

保留两位小数

把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 + "";

};
发布了107 篇原创文章 · 获赞 402 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/qq_36667170/article/details/104830873
今日推荐