JS将数字均等拆分存入数组结果异常如何修复
数字均等拆分问题修复
问题表现
需求是把指定数字做均等拆分,拆分后的数值按顺序存入数组。比如把100均等拆成4份,预期输出是[25, 25, 25, 25],但跑现有代码出来的结果是[28, 24, 24, 24],完全不符合预期。
原有错误代码
const divide = () => { var number = 100 var n = 4 var values = [] while(number > 0 && n > 0){ var a = Math.floor(number / n / 4) * 4 number -= a n-- values.push(a) } console.log(values) }
问题根因
原有逻辑从根上就写错了:
- 算单份值的时候平白无故多了
/4和*4的操作,强行把每份值对齐到4的倍数,这个规则和均等拆分没有任何关系 - 循环取整的时候没有把计算产生的余数均匀分配,最后剩下的数值全堆到了最后一次计算的结果里,拆出来的数自然大小不一
修复代码
下面的写法兼容整除和不能整除两种场景,拆出来的数最大差值不超过1,总和和原数字完全一致:
const divide = () => { const total = 100 const splitCount = 4 const values = [] // 先算每份的基础值 const base = Math.floor(total / splitCount) // 算整除后剩下的余数 let rest = total - base * splitCount for (let i = 0; i < splitCount; i++) { // 余数依次分给前面的元素,每份最多加1,保证尽可能均等 if (rest > 0) { values.push(base + 1) rest-- } else { values.push(base) } } console.log(values) // 输出[25, 25, 25, 25],符合预期 }
如果业务场景里能保证传入的数字一定能被拆分份数整除,逻辑可以更简单:
const divide = () => { const total = 100 const splitCount = 4 const perValue = total / splitCount const values = new Array(splitCount).fill(perValue) console.log(values) }
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

