/**
* 在指定的区间内取指定数量的整数
* @param {*} min 最小
* @param {*} max 最大
* @param {*} n 数量
* @returns 数组
* @example
* randomIntArrayInRange(12, 35, 10); // [ 34, 14, 27, 17, 30, 27, 20, 26, 21, 14 ]
*/
export const randomIntArrayInRange = (min, max, n = 1) => {
Array.from(
{ length: n },
() => Math.floor(Math.random() * (max - min + 1)) + min
);
};
/**
* 在指定区间区间随机去一个整数
* @param {*} min 最小
* @param {*} max 最大
* @return 随机整数
* @example
* randomIntegerInRange(0, 5); // 2
*/
export const randomIntegerInRange = (min, max) => {
Math.floor(Math.random() * (max - min + 1)) + min;
};
/**
*
* 在指定区间区间随机去一个数
* @param {*} min 最小
* @param {*} max 最大
* @return 随机数
* @example
* randomNumberInRange(2, 10); // 6.0211363285087005
*/
export const randomNumberInRange = (min, max) => {
Math.random() * (max - min) + min;
};
/**
* 根据给定的数值,保留几位小数
* @param {*} n 数值
* @param {*} decimals 保留小数位数
* @return 处理后的值
* @example
* round('1.0004',2) // 1.00
*/
export const round = (n, decimals = 0) => {
Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
};
/**
* 取平均数
* @param {...any} nums 需要求平均值的数
* @returns 平均值
* @example
* average(...[1, 2, 3]); // 2
* average(1, 2, 3); // 2
*/
export const average = (...nums) => {
nums.reduce((acc, val) => acc + val, 0) / nums.length;
};
/**
* 根据某个字段求平均值
* @param {*} arr 数组
* @param {*} fn 方法
* @returns 平均值
* @example
* averageBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], o => o.n); // 5
* averageBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], 'n'); // 5
*/
export const averageBy = (arr, fn) => {
arr
.map(typeof fn === 'function' ? fn : (val) => val[fn])
.reduce((acc, val) => acc + val, 0) / arr.length;
};
//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
export const accMul = (arg1, arg2) => {
let m = 0,
s1 = arg1.toString(),
s2 = arg2.toString();
try {
m += s1.split('.')[1].length;
} catch (e) {}
try {
m += s2.split('.')[1].length;
} catch (e) {}
return (
(Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) /
Math.pow(10, m)
);
};
//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
export const accAdd = (arg1, arg2) => {
let r1, r2, m;
try {
r1 = arg1.toString().split('.')[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split('.')[1].length;
} catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2));
return (arg1 * m + arg2 * m) / m;
};
//js 除法函数
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
export function accDiv(arg1, arg2) {
let t1 = 0,
t2 = 0,
r1,
r2;
try {
t1 = arg1.toString().split('.')[1].length;
} catch (e) {}
try {
t2 = arg2.toString().split('.')[1].length;
} catch (e) {}
r1 = Number(arg1.toString().replace('.', ''));
r2 = Number(arg2.toString().replace('.', ''));
return (r1 / r2) * Math.pow(10, t2 - t1);
}
//js 减法计算
//调用:Subtr(arg1,arg2)
//返回值:arg1减arg2的精确结果
export function accSub(arg1, arg2) {
let r1, r2, m, n;
try {
r1 = arg1.toString().split('.')[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split('.')[1].length;
} catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2));
//动态控制精度长度
n = r1 >= r2 ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(2);
}