قسّم نفقة مشتركة وفق حصص غير متساوية
التقسيم بالتساوي بسيط، لكنه ليس عادلاً دائماً. فقد تختلف مساحات غرف السكن المشترك، أو عدد ليالي إقامة المسافرين، أو يتفق أفراد الأسرة على المساهمة بحسب الدخل.
شغّل الأداة مجانًا
توزع هذه الحاسبة نفقة مشتركة واحدة باستخدام وزن لكل شخص. أدخلوا الإجمالي والأسماء والأوزان النسبية لتحصلوا على المبلغ المستحق لكل شخص مع تقريب متسق. ويمكن أن تمثل الأوزان أي معيار متفق عليه، كما أن مجموع المخصصات النهائية يطابق دائماً الإجمالي بعد التقريب.
اختاروا أوزاناً تعبّر عن الاتفاق
الوزن حصة نسبية، وليس بالضرورة نسبة مئوية أو مبلغاً نقدياً. فإذا استخدم ثلاثة أشخاص الأوزان 1 و2 و3، استحق عليهم سدس الإجمالي وسدسان وثلاثة أسداس على الترتيب. ولا يؤدي ضرب جميع الأوزان في العدد نفسه إلى تغيير النتيجة؛ لذلك تصف الأوزان 10 و20 و30 التوزيع ذاته تماماً. وهذا يجعل الحاسبة ملائمة لتوزيع الإيجار بحسب مساحة الغرفة، والمرافق بحسب الإشغال، وحجز المجموعة بحسب ليالي الإقامة، أو نفقات الأسرة بحسب الدخل. اتفقوا على معنى الأوزان قبل الحساب واستخدموا الأساس نفسه للجميع. ويمكن منح شخص وزناً يساوي صفراً إذا كان معفى عمداً من هذه النفقة تحديداً. لكن يجب أن تتضمن المجموعة قيمة موجبة واحدة على الأقل. فإذا كانت جميع الأوزان صفراً، فلا يوجد أساس رياضي لتوزيع الإجمالي، ولذلك تعيد الحاسبة خطأ في الإدخال بدلاً من افتراض تقسيم متساوٍ. ويجب أيضاً أن تكون الأسماء فريدة كي تظل النتيجة واضحة عند نسخها إلى رسالة أو سجل محاسبي.
افهموا التقريب ودقة الإجمالي
ينتج عن القسمة التناسبية كثيراً كسور أصغر من أصغر وحدة نقدية قابلة للدفع. فعلى سبيل المثال، قد يؤدي تقسيم فاتورة صغيرة بين ثلاث حصص موزونة إلى أعداد عشرية دورية. تحول الحاسبة الإجمالي أولاً إلى الدقة العشرية المختارة، ثم تحسب الحصة التناسبية الدقيقة لكل شخص، وتوزع أصغر الوحدات المتبقية بطريقة أكبر البواقي. ويحصل أصحاب أكبر البواقي الكسرية في المبالغ غير المقربة على تلك الوحدات أولاً. وإذا تساوى باقيان، يُحسم التعادل وفق ترتيب الإدخال الأصلي، فتظل النتائج حتمية عند تكرار التشغيل. والنتيجة العملية المهمة هي أن مجموع المبالغ المعروضة يساوي دائماً الإجمالي المعروض، فلا يختفي أي جزء نقدي ولا يُستحدث. استخدموا منزلتين لعملات مثل الدولار أو اليورو، وصفراً للمحاسبة بالوحدات الصحيحة، أو دقة أعلى عندما تسمح الكمية المشتركة بذلك. تمثل قيمة `share` النسبة الرياضية لكل شخص، بينما تمثل `owed` المبلغ القابل للدفع بعد التقريب. وبما أن الإجمالي نفسه يُقرب إلى الدقة المطلوبة، فأدخلوه بالدقة التي تعتمدها عملية التسوية لديكم.
راجعوا النتيجة ووضحوها
تعاملوا مع الحساب بوصفه تنفيذاً شفافاً لاتفاق المجموعة، لا الاتفاق نفسه. راجعوا الإجمالي ومجموع الأوزان ووزن كل شخص قبل طلب الأموال. فالخطأ مثل إدخال 20 بدلاً من 2 صحيح رياضياً، لكنه قد يغير التوزيع جذرياً. تعرض الاستجابة بجانب كل اسم الحصة المعيارية والمبلغ المستحق، مما يسهل توضيح كيفية الوصول إلى النتيجة. احتفظوا بالمدخلات الأصلية مع المخرجات عندما يكون التقسيم مهماً للمحاسبة، لأن الأوزان توفر سياقاً لا تظهره المبالغ وحدها. وفي النفقات المتكررة، حافظوا على ثبات قاعدة الترجيح وحدّثوها بوضوح عند تغير الظروف. نسخة المتصفح مناسبة لإيجار أو عشاء أو رحلة أو فاتورة عرضية، بينما تتيح API تطبيق القاعدة الحتمية نفسها في إدارة العقارات أو تنظيم السفر أو جداول البيانات أو أدوات التمويل الداخلية مقابل $0.002 لكل طلب. لا تجري الحاسبة تحويلاً للعملات أو نقلاً للمدفوعات؛ إذ يُفترض أن جميع المبالغ تستخدم وحدة واحدة، ولا تعيد إلا التوزيع.
حالات الاستخدام
توزيع الإيجار بحسب مساحة الغرفة
استخدموا المساحة النسبية أو تقييماً متفقاً عليه لتوزيع إيجار واحد بين المقيمين.
تقاسم تكلفة الرحلة بحسب الليالي
زنوا حصة كل مسافر بعدد ليالي مشاركته كي يدفع صاحب الإقامة الأقصر مبلغاً أقل.
توزيع نفقات الأسرة بحسب الدخل
استخدموا أوزاناً متفقاً عليها للدخل لتوزيع فاتورة مشتركة بحساب شفاف.
الأسئلة الشائعة
هل يجب أن يكون مجموع الأوزان 100؟
لا. فالأوزان نسبية ويمكن أن يكون مجموعها أي عدد موجب.
ماذا يحدث إذا كانت جميع الأوزان صفراً؟
يعيد الطلب خطأ في الإدخال، لأن التقسيم التناسبي غير ممكن عندما يكون مجموع الأوزان صفراً.
هل يمكن أن يكون وزن شخص واحد صفراً؟
نعم. سيكون المبلغ المستحق عليه صفراً ما دام هناك شخص آخر واحد على الأقل بوزن موجب.
هل يطابق مجموع المبالغ المستحقة الإجمالي بدقة؟
نعم. توزع طريقة أكبر البواقي وحدات التقريب بحيث يساوي مجموع المخصصات الإجمالي وفق الدقة المختارة.
ما تكلفة API؟
يكلف كل طلب API مبلغ $0.002. ويمكن تشغيل حاسبة الصفحة محلياً مجاناً.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/calc3/split-expenses-unequal-shares \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"total":120,"people":[{"name":"Alex","weight":1},{"name":"Blair","weight":2},{"name":"Casey","weight":3}]}'const res = await fetch("https://api.kit.forhosting.com/calc3/split-expenses-unequal-shares", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"total": 120,
"people": [
{
"name": "Alex",
"weight": 1
},
{
"name": "Blair",
"weight": 2
},
{
"name": "Casey",
"weight": 3
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/calc3/split-expenses-unequal-shares",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"total": 120,
"people": [
{
"name": "Alex",
"weight": 1
},
{
"name": "Blair",
"weight": 2
},
{
"name": "Casey",
"weight": 3
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/calc3/split-expenses-unequal-shares", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"total":120,"people":[{"name":"Alex","weight":1},{"name":"Blair","weight":2},{"name":"Casey","weight":3}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"total":120,"people":[{"name":"Alex","weight":1},{"name":"Blair","weight":2},{"name":"Casey","weight":3}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/calc3/split-expenses-unequal-shares", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"total": 120,
"people": [
{
"name": "Alex",
"weight": 1
},
{
"name": "Blair",
"weight": 2
},
{
"name": "Casey",
"weight": 3
}
]
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "calc3.split_expenses_unequal_shares",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |