notice:
- 平均红包金额不能低于0.01元
- 对浮点数四则运算和四舍五入的处理
1 <script> 2 //调用方法 3 getRedPacket(10,9); 4 5 /* 6 * @description:抢红包算法 7 * @params {Number} money 总金额 8 * @params {Number} num 红包总个数 9 * @return {Number} 10 * */ 11 function getRedPacket(money,num) { 12 let redPacketArr = [], //记录分配的红包金额 13 remainMoney = money, //剩余的红包金额 14 avgMoney = div(money,num); //平均分得的红包金额 15 if(avgMoney < 0.01){ 16 alert(‘单个红包金额不低于0.01元‘); 17 return; 18 }else{ 23 let i = 1, //计算总数量-1个 24 randomIndex = 0, //最后一个数在redPacketArr的位置 25 last = 0; //计算最后一个数 26 for(i; i < num; i++){ 27 let randomMoney = Math.random()*rewriteToFixed(avgMoney,4), //随机值,保留4位小数 28 val = rewriteToFixed(randomMoney,2); //随机值保留2为小数 29 if(val != 0){ 30 remainMoney = sub(remainMoney,val); 31 redPacketArr.push(val); 32 }else { 33 i--; 34 } 35 } 36 last = redPacketArr.reduce((x,y) => add(x,y)); 37 randomIndex = Math.floor(Math.random()*redPacketArr.length); 38 redPacketArr.splice(randomIndex,0,rewriteToFixed(sub(money,last),2)); //把最大金额随机插入redPacketArr中 39 } 40 //console.log(redPacketArr); 41 return redPacketArr; 42 } 43 /* 44 * @description:重写toFixed方法 45 * @params {Number} value,num 46 * @return {Number} 47 * */ 48 function rewriteToFixed(value,num) { 49 let str = ‘‘ + value, 50 index = str.indexOf(‘.‘), //小数点的位置 51 sliIndex = index + num + 1, 52 s1 = str.slice(0,sliIndex), 53 nextNum = Number(str.slice(sliIndex,sliIndex + 1)); 54 if(nextNum > 5){ 55 s1 = s1.replace(/\d$/,v => Number(v)+1); 56 } 57 return Number(s1); //随机值保留2为小数 58 } 59 /* 60 * @description:浮点数相加 61 * @params {Number} n1,n2 62 * @return {Number} 63 * */ 64 function add(n1,n2) { 65 let e = commonCode(n1,n2); 66 return (n1*e + n2*e)/e; 67 } 68 69 /* 70 * @description:浮点数相减 71 * @params {Number} n1,n2 72 * @return {Number} 73 * */ 74 function sub(n1,n2) { 75 let e = commonCode(n1,n2); 76 return (n1*e - n2*e)/e; 77 } 78 79 /* 80 * @description:浮点数相乘 81 * @params {Number} n1,n2 82 * @return {Number} 83 * */ 84 function mul(n1,n2) { 85 let e = commonCode(n1,n2); 86 return (n1*e) * (n2*e) / Math.pow(e,2); 87 } 88 89 /* 90 * @description:浮点数相除 91 * @params {Number} n1,n2 92 * @return {Number} 93 * */ 94 function div(n1,n2) { 95 let e = commonCode(n1,n2); 96 return (n1*e) / (n2*e); 97 } 98 99 /* 100 * @description:公共代码 101 * @params {Number} n1,n2 102 * @return {Number} e 将n1和n2带小数带转成整型 103 * */ 104 function commonCode(n1,n2) { 105 let len1 = 0, 106 len2 = 0, 107 str1 = (‘‘ + n1), 108 str2 = (‘‘ + n2); 109 if(/\./g.test(str1)){ 110 len1 = str1.split(‘.‘)[1].length; //n1小数长度 //toString()或String()用于小数后不超过7位 111 } 112 if(/\./g.test(str2)){ 113 len2 = str2.split(‘.‘)[1].length; //n2小数长度 114 } 115 return Math.pow(10,Math.max(len1,len2)); 116 } 117 </script>