宗地面积同分母整数分数拆分求解 单户误差≤1㎡且总面积不变
宗地共有份额最小公分母计算方案
核心约束
计算前先明确所有硬性规则:
- 宗地总面积固定为8027㎡,共6名权利人,各户原始登记面积见明细
- 折算后单户面积与原始面积差值不得超过±1㎡
- 所有份额以整数分子、统一公分母的分数形式呈现,公分母取满足条件的最小值
- 所有份额相加必须等于1,保证折算后总面积与原始总面积完全相等,无面积出入
原有代码问题
原实现单独为每户计算最简分数,存在三个核心缺陷:
- 没有统一公分母,各户分数分母不一致,无法直接用于共有权份额登记
- 未校验份额总和约束,单独约分后大概率出现份额总和不等于1的问题,导致总面积偏差
- 固定取10000作为初始分母,无法得到最小公分母
计算逻辑
本质是从小到大遍历候选公分母D,对每个D校验两个条件:
- 每户按最接近的整数分子n_i折算的面积,与原始面积误差在±1㎡以内
- 所有户的分子n_i相加刚好等于D(即n_i/D总和为1,折算总面积严格等于8027㎡)
第一个满足以上条件的D就是最小公分母。
修正后代码
function gcd(a, b) { return b < 1e-6 ? a : gcd(b, a % b); } const totalArea = 8027; const areaParts = [1003.5, 1003.5, 1337, 1338, 1338, 2007]; const holders = ['权利人A', '权利人B', '权利人C', '权利人D', '权利人E', '权利人F']; let minDenominator = null; let validNumerators = null; // 从1开始遍历候选分母,上限设1000足够覆盖业务场景 for (let d = 1; d <= 1000; d++) { const unitArea = totalArea / d; const numerators = []; let isValid = true; for (const area of areaParts) { // 取最接近的整数作为当前户的分子 const n = Math.round(area / unitArea); const calcArea = n * unitArea; // 误差超过±1直接跳过当前分母 if (Math.abs(calcArea - area) > 1) { isValid = false; break; } numerators.push(n); } // 校验分子总和等于分母,即份额总和为1 if (isValid && numerators.reduce((sum, cur) => sum + cur, 0) === d) { minDenominator = d; validNumerators = numerators; break; } } // 整理输出结果 const result = holders.map((name, idx) => { const n = validNumerators[idx]; const calcArea = n * totalArea / minDenominator; // 对单户份额约分 const divisor = gcd(n, minDenominator); return { 权利人: name, 原始面积: `${areaParts[idx]}㎡`, 折算面积: `${calcArea.toFixed(3)}㎡`, 误差: `${(calcArea - areaParts[idx]).toFixed(3)}㎡`, 份额: `${n/divisor}/${minDenominator/divisor}` }; }); console.log('满足条件的最小公分母:', minDenominator); console.table(result);
计算结果
经遍历校验,满足所有约束的最小公分母为24,各户份额明细如下:
- 权利人A:份额
1/8,折算面积1003.375㎡,误差-0.125㎡ - 权利人B:份额
1/8,折算面积1003.375㎡,误差-0.125㎡ - 权利人C:份额
1/6,折算面积1337.833㎡,误差+0.833㎡ - 权利人D:份额
1/6,折算面积1337.833㎡,误差-0.167㎡ - 权利人E:份额
1/6,折算面积1337.833㎡,误差-0.167㎡ - 权利人F:份额
1/4,折算面积2006.75㎡,误差-0.25㎡
校验:所有份额相加1/8 + 1/8 + 1/6 + 1/6 + 1/6 + 1/4 = 1,折算总面积为8027㎡,与原始总面积完全一致,单户误差均在±1㎡要求范围内。
内容的提问来源于stack exchange,提问作者vdevcic
相关产品推荐
相关产品推荐

