JS数字处理
前言
在前端开发的过程中经常会遇到做一些数字处理(比如js精度问题等等),以下是我的一些总结。
一、处理数字:打逗号
有一些数据金额比较大,需要每隔三个数字打一个逗号。
代码如下:
/**
* 处理数字:打逗号
* @param str
*/
export const handalNumber = (str) => {
return str
.split('')
.reverse()
.join('')
.replace(/(\d{3})/g, '$1,')
.replace(/,$/, '')
.split('')
.reverse()
.join('');
};
使用:
let num = handalNumber(String(542549007))
console.log(num) // 542,549,007
二、精度问题
Js没有内置处理精度问题的方法,所以需要我们自己处理。我们可以使用(a*10^n - b *10^n)/ 10^n 这样来处理。
如下所示:
let num = (1 - 0.9)
console.log(num) // 0.09999999999999998
let num1 = (1 * 10 - 0.9 * 10) / 10
console.log(num1) // 0.1
由此,我们可以封装一个方法
如下所示:
/**
* 处理小数点的加减
* @param {Float} arg1 参数1
* @param {Float} arg2 参数2
* @param {Boolean} isAdd 是否为加法
* @param {Number} ratio 扩大的比例
*/
export const pointOperation = (arg1, arg2, isAdd = true, ratio = 1) => {
let r1;
let r2;
try {
r1 = arg1.toString().split('.')[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split('.')[1].length;
} catch (e) {
r2 = 0;
}
// Math.pow() 函数返回基数(base)的指数(exponent)次幂,即 base^exponent
const m = Math.pow(10, Math.max(r1, r2));
const n = r1 >= r2 ? r1 : r2;
return isAdd
? ((arg1 * m + arg2 * m) / m) * ratio
: ((arg1 * m - arg2 * m) / m).toFixed(n) * ratio;
};
使用示例:
// 计算 1-0.9
let num = pointOperation(1, 0.9, false)
console.log(num) // 0.1
// 计算 1+0.9 将计算结果扩大100倍
let num1 = pointOperation(1, 0.9, true, 100)
console.log(num1) // 190