【转】JS计算保留小数位数并且不补0

实际项目当中遇到这样一个问题,就是js计算会出现无穷大小数,所以选择用toFixed(num)方法,其中num设置过大,小数点后位数不够会用0进行补位,用户体验非常不好。

js计算会出现无穷大数的原因

js中只有Number一种类型,并且 Number采用的时IEEE 754 64位双精度浮点数编码 。比如0.1 + 0.2 = 0.30000000000000004,计算时会把0.1和0.2转换成二进制数,计算后在转成十进制就成了0.30000000000000004。

将每个浮点数乘以10的N次方,计算完成后再除以10的N次方

1
2
3
4
5
formatFloat(f,digit){
let m = Math.pow(10, digit);
let num = Math.round(f * m) / m;
return num;
}

f是计算表达式,digit是需要乘以10的多少次方。
比如:formatFloat(0.1+0.2,2);
return返回的结果是:0.3

toFixed()方法舍入规则

toFixed()方法使用的是银行家舍入规则。四舍六入五成双,即“4舍6入5凑偶”这里“四”是指≤4 时舍去,”六”是指≥6时进上,”五”指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是偶数)

最终解决方案

1
2
3
4
5
6
7
8
9
10
11
12
Number.prototype.fixed=function(len)
{
len=isNaN(len)?0:len
var num=Math.pow(10,len)
return Math.round(this*num)/num
}
//test
Number('').fixed()
Number('213412DDD').fixed()
1234.152354.fixed()
1234.152354.fixed(2)
1234.152354.fixed(10)

根据以上方法就可以既保留小数位数,并且位数不足时不在补0。

Mr.Rong wechat
欢迎您扫一扫上面的二维码,关注我的微信公众号!
0%