JS 的数字都是双浮点类型,在咱们平时应用中常常会有数字化整或保留几位小数的需要。前些日子拼多多就以显示空间无限,在 99.99 后还有未显示的 6 位小数为由打赢了官司
本文总结了几种罕用的解决位数的办法,并给出了我在我的项目中罕用的工具函数。
小数化整
Math
说到小数化整,立即想到的就是 Math
对象提供的三个办法吧,
Math.ceil
:返回大于或等于给定数字的最小整数Math.floor
:返回小于或等于给定数字的最小整数Math.round
:返回数字四舍五入后最靠近的整数
Math.ceil(1.5) // 2
Math.floor(1.5) // 1
Math.round(1.5) // 2
Math.ceil(-1.5) // -1
Math.floor(-1.5) // -2
Math.round(-1.5) // -1
Math 的办法简略实用,问题在于要写的字符较多
位运算
数字在进行位运算时,会主动把小数局部省略掉
常见的位运算有:位与 |
、位或 &
、左移 >>
、右移 <<
仅用于小数化整不扭转原数字的话,能够采纳以下写法
1.5 | 0 // 1
1.5 >> 0 // 1
1.5 << 0 // 1
-1.5 | 0 // -1
应用位运算来化整数代码量小,代替负数的 Math.floor
,与 Math.trunc
成果完全一致
须要留神的是,位运算的优先级是低于四则运算的
1.5 | 0 + 1 // 1
(1.5 | 0) + 1 // 2
保留固定位数
toFixed
toFixed 是数字的一个办法,用于返回一个固定小数位数的字符串,默认保留 0 位
toFixed 采取的也是四舍五入的规定,然而仅一个 5
的时候一样会被舍去
1.555.toFixed() // '2'
1.555.toFixed(1) // '1.6'
1.555.toFixed(2) // '1.55'
1.555.toFixed(4) // '1.5550'
个别在网页显示金额、工夫时会用到这个函数
全能函数
但须要留神的是,有些场合并不能够四舍五入的,99.996
是不能化成 100.00
的,所以接下来实现本人的全能函数
代码如下:
/**
* @description: 将数字按指定的规定解决
* @param {number} num 要解决的数字
* @param {number} bits 要保留的位数,默认化为整数,容许传入正数
* @param {number} sign 要执行的取整形式,0 向下取整,1 向上取整,2 四舍五入,3 间接截取
* @param {number} type 返回的数据类型,0 数字,1 字符串
* @return {number|string}
*/
const fix = (num, bits = 0, sign = 2, type = 0) => {
const pow = 10 ** bits
num *= pow
const fun = ['floor', 'ceil', 'round', 'trunc'][sign]
num = Math[fun](num)
num /= pow
return type == 0 ? num : num.toFixed(bits)
}
fix(99.996) // 100
fix(99.996, -1, 0) // 90
fix(99.996, 2, 0, 1) // '99.99'
fix(99.996, 2, 1, 1) // '100.00'
结语
如果文中有不了解或不谨严的中央,欢送评论发问。
如果喜爱或有所帮忙,心愿能点赞关注,激励一下作者。