/** * 截取小数点后dots位 * @param {Number} number 要截取的小数 * @param {Number} dots 小数点位数 * @returns */ function truncateToTenDecimals(number, dots) { const str = number.toString(); const decimalIndex = str.indexOf("."); // 如果没有小数部分,直接返回原始数值 if (decimalIndex === -1) { return str; } // 截取到小数点后 10 位 const truncatedStr = str.slice(0, decimalIndex + dots + 1); return Number(truncatedStr); } /** * 根据shares队列计算每个user本轮次的分配占比 * @param {Array} data [{user:"user1", pool_diff:100, miner_diff:100}, ] * @returns {"1x1":{totalWeight:10, weightRatio:0.1}} */ function calculate_shares_weight(data) { // Step 1: 按照 user 分类计算每个 user 的总 weight const userWeights = data.reduce((acc, item) => { const weight = item.miner_diff / item.pool_diff; if (!acc[item.user]) { acc[item.user] = { totalWeight: 0, data: [] }; } acc[item.user].totalWeight += weight; acc[item.user].data.push(item); return acc; }, {}); // Step 2: 计算所有 user 的总 weight const totalWeight = Object.values(userWeights).reduce((acc, user) => acc + user.totalWeight, 0); // Step 3: 计算每个 user 的 weight 占总 weight 的比重并返回所需格式 const userWeightRatios = Object.keys(userWeights).reduce((acc, user) => { const weightRatio = truncateToTenDecimals(userWeights[user].totalWeight / totalWeight, 10); acc[user] = Number(weightRatio); return acc; }, {}); return userWeightRatios; } module.exports = { calculate_shares_weight, truncateToTenDecimals };