如何用JavaScript/jQuery将数值拆分为无小数三等份数组?
整数拆分方案:将数值均分为指定份数且总和严格一致
核心思路
要避免round导致总和超标的问题,关键是先取整除后的基础值,再把余数分配到前几份中:
- 计算每份的基础值:用
Math.floor(total / parts)向下取整,确保不会出现向上取整累加超标的情况 - 计算余数:
total % parts,这个余数就是需要额外加1的份数 - 前
余数份每份加1,剩余份数保持基础值,总和必然与原数值完全相等
JavaScript实现代码
function splitInteger(total, parts = 3) { // 边界校验:确保输入为正整数 if (!Number.isInteger(total) || total < 0 || !Number.isInteger(parts) || parts < 1) { throw new Error('总和和份数必须为正整数'); } const baseValue = Math.floor(total / parts); const remainder = total % parts; const result = []; for (let i = 0; i < parts; i++) { // 前remainder份每份加1,其余保持基础值 result.push(i < remainder ? baseValue + 1 : baseValue); } return result; }
测试示例
拆分800为3份
const splitResult = splitInteger(800); console.log(splitResult); // 输出: [267, 267, 266] console.log(splitResult.reduce((sum, num) => sum + num)); // 输出: 800
其他场景测试
- 拆分799为3份:
[267, 266, 266],总和799 - 拆分600为3份:
[200, 200, 200],总和600 - 拆分5为2份:
[3, 2],总和5
为什么round会出问题?
以800为例,800/3≈266.666,用round会得到3个267,总和为801,超出原数值。而用floor取基础值266,再把余数2分配给前2份,每份加1,既保证了每份尽可能平均,又严格控制总和与原数值一致。
内容的提问来源于stack exchange,提问作者Chintan Pandya
相关产品推荐
相关产品推荐

