如何将数字数组按比例调整至总和为100?现有代码零值处理异常
解决数组全为0时按比例调整至总和100的问题
嘿,我懂你遇到的这个问题——当数组里全是0的时候,原代码没法输出均分100的结果,反而还是全0。这是因为原代码里的total会变成0,导致remainder / total出现除以0的情况,JavaScript里这会得到Infinity,而0 * Infinity又是NaN,最后return newValue || 0把NaN转成了0,自然就不符合你的预期了。
这里有个修正后的方案,能同时处理普通数组和全0数组的情况:
function grossUpArray(arrayOfNum) { // 先计算数组总和,如果你已经有getTotal函数可以直接替换 const total = arrayOfNum.reduce((acc, curr) => acc + curr, 0); // 处理全0的特殊情况:直接均分100 if (total === 0) { const equalShare = Number((100 / arrayOfNum.length).toFixed(2)); return arrayOfNum.map(() => equalShare); } // 普通情况按比例调整 const remainder = 100 - total; return arrayOfNum.map(num => { const adjustedValue = num + ((remainder / total) * num); // 保留两位小数,和示例输出一致 return Number(adjustedValue.toFixed(2)) || 0; }); }
代码说明:
- 先判断数组总和是否为0:如果是,直接计算每个元素应得的
100 / 数组长度,用toFixed(2)保证结果是两位小数,和你的示例输出格式匹配 - 非全0的情况沿用你原来的比例调整逻辑,同样加入
toFixed(2)来统一小数位数 - 用
Number()把字符串转成数字类型,避免返回字符串格式的数值
测试示例:
- 输入
[0,0,0]→ 输出[33.33, 33.33, 33.33] - 输入
[1,1]→ 输出[50,50] - 输入
[1,2]→ 输出[33.33, 66.67]
这样就能完美覆盖所有情况啦!
内容的提问来源于stack exchange,提问作者SMH
相关产品推荐
相关产品推荐

