You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

宗地面积同分母整数分数拆分求解 单户误差≤1㎡且总面积不变

宗地共有份额最小公分母计算方案

核心约束

计算前先明确所有硬性规则:

  • 宗地总面积固定为8027㎡,共6名权利人,各户原始登记面积见明细
  • 折算后单户面积与原始面积差值不得超过±1㎡
  • 所有份额以整数分子、统一公分母的分数形式呈现,公分母取满足条件的最小值
  • 所有份额相加必须等于1,保证折算后总面积与原始总面积完全相等,无面积出入

原有代码问题

原实现单独为每户计算最简分数,存在三个核心缺陷:

  • 没有统一公分母,各户分数分母不一致,无法直接用于共有权份额登记
  • 未校验份额总和约束,单独约分后大概率出现份额总和不等于1的问题,导致总面积偏差
  • 固定取10000作为初始分母,无法得到最小公分母

计算逻辑

本质是从小到大遍历候选公分母D,对每个D校验两个条件:

  1. 每户按最接近的整数分子n_i折算的面积,与原始面积误差在±1㎡以内
  2. 所有户的分子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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 20:15:44