首页 > 编程知识 正文

如何保留两位小数,0.7479保留两位小数

时间:2023-05-04 09:24:04 阅读:273864 作者:1585

文章目录 保留两位小数向下取整向上取整四舍五入方法一方法二 为什么这么写才会生效?先说为什么不能只用.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方法

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。