كيفية تقريب الأرقام لأعلى أو لأسفل أو للأقرب

التحكم في كيفية تقريب JavaScript للأرقام العشرية عند التنسيق باستخدام أوضاع التقريب المختلفة

مقدمة

عند تنسيق الأرقام للعرض، غالبًا ما تحتاج إلى تقريب القيم العشرية. يجب أن يصبح سعر $2.567 هو $2.57. قد يُعرض قياس 3.891 متر على أنه 4 أمتار. الطريقة التي تقرب بها هذه الأرقام تؤثر على الدقة وتوقعات المستخدم والمنطق التجاري.

تتطلب المواقف المختلفة استراتيجيات تقريب مختلفة. في بعض الأحيان تحتاج إلى التقريب لأعلى لضمان فرض رسوم كافية على منتج ما. في بعض الأحيان تحتاج إلى التقريب لأسفل للبقاء ضمن الميزانية. في أغلب الأحيان، تقرب إلى أقرب قيمة للحفاظ على الدقة.

توفر JavaScript تسعة أوضاع تقريب مختلفة من خلال واجهة برمجة التطبيقات Intl.NumberFormat. تتحكم هذه الأوضاع في كيفية تقريب الأرقام عندما تقع بين قيمتين محتملتين. يشرح هذا الدرس أوضاع التقريب الثلاثة الأكثر شيوعًا ويوضح متى يتم استخدام الأوضاع الأخرى.

كيف تقرب JavaScript الأرقام افتراضيًا

عند تنسيق رقم دون تحديد وضع التقريب، تستخدم JavaScript استراتيجية تسمى halfExpand. يقرب هذا الوضع القيم إلى أقرب قيمة ممكنة، وعندما يقع رقم في المنتصف تمامًا بين قيمتين، يقرب بعيدًا عن الصفر.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0
});

console.log(formatter.format(2.4));
// Output: "2"

console.log(formatter.format(2.5));
// Output: "3"

console.log(formatter.format(2.6));
// Output: "3"

القيمة 2.4 أقرب إلى 2 من 3، لذا تُقرب لأسفل إلى 2. القيمة 2.6 أقرب إلى 3 من 2، لذا تُقرب لأعلى إلى 3. القيمة 2.5 تقع في المنتصف تمامًا بين 2 و 3، لذا يقربها وضع halfExpand بعيدًا عن الصفر إلى 3.

يتطابق هذا السلوك الافتراضي مع ما يتعلمه معظم الناس في المدرسة ويتوقعونه في الحسابات اليومية. يوزع أخطاء التقريب بالتساوي على العديد من الحسابات، مما يجعله مناسبًا لتنسيق الأرقام للأغراض العامة.

فهم معنى البعد عن الصفر

تصف عبارة "البعد عن الصفر" اتجاه التقريب للأعداد التي تقع بالضبط في منتصف المسافة بين قيمتين محتملتين. بالنسبة للأعداد الموجبة، التقريب بعيداً عن الصفر يعني التقريب للأعلى. بالنسبة للأعداد السالبة، التقريب بعيداً عن الصفر يعني التقريب للأسفل إلى قيمة مطلقة أكبر.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0
});

console.log(formatter.format(2.5));
// Output: "3"

console.log(formatter.format(-2.5));
// Output: "-3"

كل من 2.5 و-2.5 يتم تقريبهما بعيداً عن الصفر. بالنسبة لـ 2.5، البعد عن الصفر يعني نحو اللانهاية الموجبة، مما ينتج 3. بالنسبة لـ -2.5، البعد عن الصفر يعني نحو اللانهاية السالبة، مما ينتج -3. في كلتا الحالتين، تزداد القيمة المطلقة.

التقريب للأعلى باستخدام ceil

يقوم وضع التقريب ceil دائماً بالتقريب نحو اللانهاية الموجبة. بالنسبة للأعداد الموجبة، يعني هذا التقريب للأعلى. بالنسبة للأعداد السالبة، يعني هذا التقريب نحو الصفر.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "ceil"
});

console.log(formatter.format(2.1));
// Output: "3"

console.log(formatter.format(2.9));
// Output: "3"

console.log(formatter.format(-2.1));
// Output: "-2"

console.log(formatter.format(-2.9));
// Output: "-2"

هذا الوضع مفيد عندما تحتاج إلى التأكد من أن العدد لن يكون أصغر من اللازم أبداً. على سبيل المثال، إذا حسبت أن صندوقاً يمكنه استيعاب 2.3 عنصر، فأنت بحاجة إلى 3 صناديق. إذا حسبت أن مهمة تستغرق 1.1 يوم، فأنت بحاجة إلى التخطيط ليومين.

const boxFormatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "ceil"
});

const itemsPerBox = 5;
const totalItems = 12;
const boxesNeeded = totalItems / itemsPerBox;

console.log(boxFormatter.format(boxesNeeded));
// Output: "3"

ينتج الحساب 2.4 صندوق، لكن لا يمكنك طلب جزء من صندوق. التقريب للأعلى يضمن أن لديك سعة كافية.

التقريب للأسفل باستخدام floor

يقوم وضع التقريب floor دائماً بالتقريب نحو اللانهاية السالبة. بالنسبة للأعداد الموجبة، يعني هذا التقريب للأسفل. بالنسبة للأعداد السالبة، يعني هذا التقريب بعيداً عن الصفر.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "floor"
});

console.log(formatter.format(2.1));
// Output: "2"

console.log(formatter.format(2.9));
// Output: "2"

console.log(formatter.format(-2.1));
// Output: "-3"

console.log(formatter.format(-2.9));
// Output: "-3"

هذا الوضع مفيد عندما تحتاج إلى تقديرات متحفظة أو عندما تريد البقاء ضمن الحدود. على سبيل المثال، إذا كان لديك ميزانية قدرها $100.87، قد تعرضها كـ $100 لتجنب الإنفاق الزائد عن طريق الخطأ.

const budgetFormatter = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  maximumFractionDigits: 0,
  roundingMode: "floor"
});

const availableBudget = 100.87;

console.log(budgetFormatter.format(availableBudget));
// Output: "$100"

يضمن التقريب لأسفل أن المبلغ المعروض يمكن تحقيقه دائمًا بالميزانية الفعلية.

التقريب إلى الأقرب باستخدام halfExpand

بينما يعتبر halfExpand هو الوضع الافتراضي، يمكنك تحديده بشكل صريح لتوضيح نيتك في الكود. يقرب هذا الوضع إلى أقرب قيمة ويتعامل مع حالات نقطة المنتصف بالتقريب بعيدًا عن الصفر.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 1,
  roundingMode: "halfExpand"
});

console.log(formatter.format(2.14));
// Output: "2.1"

console.log(formatter.format(2.15));
// Output: "2.2"

console.log(formatter.format(2.16));
// Output: "2.2"

القيمة 2.14 أقرب إلى 2.1، لذا يتم تقريبها إلى 2.1. القيمة 2.16 أقرب إلى 2.2، لذا يتم تقريبها إلى 2.2. تقع القيمة 2.15 في منتصف المسافة بالضبط، لذا يتم تقريبها بعيدًا عن الصفر إلى 2.2.

يعمل هذا الوضع بشكل جيد لمعظم مهام تنسيق الأرقام لأنه يقلل من إجمالي خطأ التقريب عبر العديد من العمليات الحسابية. كل قيمة في نقطة المنتصف لديها فرصة متساوية لأن تكون على الجانب الموجب أو السالب من الصفر، لذا يتوازن اتجاه التقريب بمرور الوقت.

دمج أوضاع التقريب مع أرقام الكسور

تعمل أوضاع التقريب معًا مع إعدادات أرقام الكسور للتحكم في الناتج النهائي. يحدد خيار maximumFractionDigits عدد المنازل العشرية التي تظهر، ويحدد roundingMode كيفية التعامل مع القيم التي تقع بين الأرقام القابلة للتمثيل.

const ceilFormatter = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  minimumFractionDigits: 2,
  maximumFractionDigits: 2,
  roundingMode: "ceil"
});

console.log(ceilFormatter.format(10.001));
// Output: "$10.01"

console.log(ceilFormatter.format(10.999));
// Output: "$11.00"

مع منزلتين عشريتين، تحتاج 10.001 إلى التقريب إما إلى 10.00 أو 10.01. يقرب وضع ceil لأعلى، منتجًا 10.01. تقرب القيمة 10.999 لأعلى إلى 11.00.

التقريب نحو الصفر باستخدام trunc

يقرب وضع التقريب trunc نحو الصفر، مما يعني أنه يزيل الجزء الكسري من العدد. بالنسبة للأرقام الموجبة، يقرب هذا لأسفل. بالنسبة للأرقام السالبة، يقرب هذا لأعلى.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "trunc"
});

console.log(formatter.format(2.1));
// Output: "2"

console.log(formatter.format(2.9));
// Output: "2"

console.log(formatter.format(-2.1));
// Output: "-2"

console.log(formatter.format(-2.9));
// Output: "-2"

يقوم هذا الوضع فعليًا بقطع الجزء العشري. وهو مفيد عندما تريد إظهار الجزء الصحيح فقط من العدد دون النظر في القيمة الكسرية لأغراض التقريب.

التقريب بعيدًا عن الصفر باستخدام expand

يقوم وضع التقريب expand بالتقريب بعيدًا عن الصفر. بالنسبة للأعداد الموجبة، يقرب هذا لأعلى. بالنسبة للأعداد السالبة، يقرب هذا لأسفل إلى قيمة مطلقة أكبر.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "expand"
});

console.log(formatter.format(2.1));
// Output: "3"

console.log(formatter.format(2.9));
// Output: "3"

console.log(formatter.format(-2.1));
// Output: "-3"

console.log(formatter.format(-2.9));
// Output: "-3"

يضمن هذا الوضع أن التقريب يزيد دائمًا من القيمة المطلقة للعدد. يمكن أن يكون مفيدًا في السياقات المالية حيث تريد أن تكون متحفظًا في اتجاه يفضل الدقة على التقليل من التقدير.

فهم أوضاع تقريب القيم المتوسطة

الأوضاع الخمسة التي تبدأ بـ half جميعها تقرب إلى أقرب قيمة، لكنها تختلف في كيفية التعامل مع الحالات المتوسطة بالضبط. توفر لك هذه الأوضاع تحكمًا دقيقًا في سلوك كسر التعادل عندما تقع القيم بالضبط بين رقمين قابلين للتمثيل.

يقوم وضع halfCeil بتقريب القيم المتوسطة نحو اللانهاية الموجبة.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "halfCeil"
});

console.log(formatter.format(2.5));
// Output: "3"

console.log(formatter.format(-2.5));
// Output: "-2"

يقوم وضع halfFloor بتقريب القيم المتوسطة نحو اللانهاية السالبة.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "halfFloor"
});

console.log(formatter.format(2.5));
// Output: "2"

console.log(formatter.format(-2.5));
// Output: "-3"

يقوم وضع halfTrunc بتقريب القيم المتوسطة نحو الصفر.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "halfTrunc"
});

console.log(formatter.format(2.5));
// Output: "2"

console.log(formatter.format(-2.5));
// Output: "-2"

يقوم وضع halfEven بتقريب القيم المتوسطة إلى أقرب عدد زوجي. يُطلق على هذا الوضع أحيانًا اسم تقريب المصرفيين لأنه يقلل من الانحياز في الحسابات المالية.

const formatter = new Intl.NumberFormat("en-US", {
  maximumFractionDigits: 0,
  roundingMode: "halfEven"
});

console.log(formatter.format(2.5));
// Output: "2"

console.log(formatter.format(3.5));
// Output: "4"

console.log(formatter.format(4.5));
// Output: "4"

تُقرب القيمة 2.5 إلى 2 لأن 2 عدد زوجي. تُقرب القيمة 3.5 إلى 4 لأن 4 عدد زوجي. تُقرب القيمة 4.5 أيضًا إلى 4 لأن 4 عدد زوجي.

اختيار وضع التقريب لتطبيقك

يعتمد وضع التقريب الذي تختاره على متطلبات عملك وطبيعة البيانات التي تعرضها. تتطلب السياقات المختلفة استراتيجيات مختلفة.

استخدم ceil عندما تحتاج إلى ضمان الكفاية. غالبًا ما يتطلب تخطيط السعة وعد المخزون وتقديرات الوقت التقريب لأعلى لضمان موارد كافية.

استخدم floor عندما تحتاج إلى البقاء ضمن الحدود. غالباً ما تتطلب عروض الميزانية وتتبع الحصص وحسابات الخصم التقريب للأسفل لتجنب تجاوز الموارد المتاحة.

استخدم halfExpand للعرض العام حيث تكون الدقة مهمة ولكن الدقة الفائقة ليست حرجة. هذا هو الوضع الافتراضي لسبب وجيه ويعمل بشكل جيد لمعظم مهام تنسيق الأرقام.

استخدم halfEven للحسابات المالية حيث تحتاج إلى تقليل التحيز التراكمي للتقريب. يضمن هذا الوضع أنه على مدار العديد من الحسابات، لا تفضل أخطاء التقريب باستمرار اتجاهاً واحداً.

استخدم trunc عندما تريد عرض الجزء الصحيح من الرقم فقط دون تطبيق منطق التقريب على الجزء الكسري.

استخدام أوضاع التقريب مع تنسيق العملة

تتفاعل أوضاع التقريب بشكل طبيعي مع تنسيق العملة. لدى الشركات المختلفة قواعد مختلفة حول كيفية تقريب قيم العملة، ويتيح لك خيار roundingMode تنفيذ تلك القواعد.

const retailPrice = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  minimumFractionDigits: 2,
  maximumFractionDigits: 2,
  roundingMode: "ceil"
});

const wholesalePrice = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  minimumFractionDigits: 2,
  maximumFractionDigits: 2,
  roundingMode: "floor"
});

const calculatedPrice = 19.874;

console.log(retailPrice.format(calculatedPrice));
// Output: "$19.88"

console.log(wholesalePrice.format(calculatedPrice));
// Output: "$19.87"

قد يقوم بائع التجزئة بتقريب الأسعار للأعلى لضمان الربحية، بينما قد يقوم تاجر الجملة بالتقريب للأسفل للبقاء تنافسياً. ينتج نفس السعر المحسوب قيماً معروضة مختلفة بناءً على قواعد العمل المشفرة في وضع التقريب.