xms-basic-util
Version:
js基础工具类集合,集成方便后期调用,通过webpack编译,支持多种平台,如es6、node、浏览器引入等 ## 使用 ### es6方法 - 安装 ``` npm install xms-basic-util ``` - 导入 ``` import xmsBasicUtil from 'xms-basic-util' //日期转换工具对象 const dateFormat = xmsBasicUtil.dateFormat; //数字处理工具对象 const mathUtil = xmsBasicUt
151 lines (141 loc) • 3.77 kB
JavaScript
/**
* 针对数字运算解决、兼容了数字精度丢失问题
* @type {*[]}
*/
// 测试数据
const saleItems = [
{ month: 1, date: 1, transationId: '1', salePrice: 100.22 },
{ month: 1, date: 2, transationId: '2', salePrice: 102.01 },
{ month: 5, date: 3, transationId: '3', salePrice: 1020.99 },
{ month: 3, date: 1, transationId: '4', salePrice: 89.22 },
{ month: 12, date: 1, transationId: '5', salePrice: 78.45 },
{ month: 9, date: 2, transationId: '6', salePrice: 343.22 },
{ month: 9, date: 2, transationId: '7', salePrice: 23.01 },
{ month: 10, date: 3, transationId: '8', salePrice: 11.11 }
]
/**
* 计算季度销量
* @param saleItems
* @returns {[]}
*/
function sumByQuarter (saleItems) {
const array = []
const quarterMap = {}
saleItems.forEach(item => {
const quarter = parseInt((item.month - 1) / 3) + 1
quarterMap[quarter] = quarterMap[quarter] || []
quarterMap[quarter].push(item)
})
for (const quarter in quarterMap) {
const value = quarterMap[quarter]
const transactionNums = value.length
const totalPrices = value.reduce((prev, cur) => {
return math.accAdd(prev, cur.salePrice)
}, 0)
array.push({
quarter: quarter,
totalPrices: totalPrices,
transactionNums: transactionNums
})
}
return array
}
/**
* 计算季度平均销量
* @param saleItems
* @returns {*|*[]}
*/
function averageByQuarter (saleItems) {
let array = sumByQuarter(saleItems)
array.forEach(item => {
item.totalPrices = math.accDiv(item.totalPrices, item.transactionNums, 2)
})
// 属性名替换
array = JSON.parse(JSON.stringify(array).replace(/totalPrices/g, 'averagePrices'))
return array
}
/**
* 数字运算
*/
const math = {
/**
* 除法 解决数字精度丢失
* @param arg1
* @param arg2
* @param decimals 保留小数的位数
* @returns {number|*}
*/
accDiv (arg1, arg2, decimals) {
const [t1, t2] = this.getDitLength(arg1, arg2)
const num = Number((this.decimalToInt(arg1) / this.decimalToInt(arg2)) * Math.pow(10, t2 - t1))
return this.decimalsFormat(num, decimals)
},
/**
* 加法
* @param arg1
* @param arg2
* @returns {number|*}
*/
accAdd (arg1, arg2) {
const [r1, r2] = this.getDitLength(arg1, arg2)
const m = Math.pow(10, Math.max(r1, r2))
return this.accDiv((this.accMul(arg1, m) + this.accMul(arg2, m)), m, 2)
},
/**
* 乘法
* @param arg1
* @param arg2
* @param decimals 保留小数的位数
* @returns {number|*}
*/
accMul (arg1, arg2, decimals) {
const [r1, r2] = this.getDitLength(arg1, arg2)
const m = r1 + r2
const num = this.decimalToInt(arg1) * this.decimalToInt(arg2) / Math.pow(10, m)
return this.decimalsFormat(num, decimals)
},
/**
* 获取小数点的位数
* @param arg1
* @param arg2
* @returns {[number, number]}
*/
getDitLength (arg1, arg2) {
let r1, r2
try {
r1 = arg1.toString().split('.')[1].length
} catch (e) {
r1 = 0
}
try {
r2 = arg2.toString().split('.')[1].length
} catch (e) {
r2 = 0
}
return [r1, r2]
},
/**
* 保留小数位
* @param num
* @param decimals
* @returns {number}
*/
decimalsFormat (num, decimals) {
if (decimals != undefined && decimals >= 0) {
num = Math.round(num * Math.pow(10, decimals)) / Math.pow(10, decimals)
}
return num
},
/**
* 去掉小数点
* @param param
* @returns {number}
*/
decimalToInt (param) {
return Number(param.toString().replace('.', ''))
}
}
// 计算季度销量
console.log('sumByQuarter:%o', sumByQuarter(saleItems))
// 计算季度平均销量
console.log('averageByQuarter:%o', averageByQuarter(saleItems))