هناك نوعان مختلفان من الأعداد في Elixir: الأعداد الصحيحة والأعداد العشرية.
الأعداد العشرية هي أعداد فيها رقم واحد أو أكثر بعد الفاصلة العشرية. وهي تستخدم صيغة الأعداد العشرية مزدوجة الدقة ذات 64 بت.
float = 3.45
# => 3.45
تدعم Elixir أيضًا الصيغة العلمية للأعداد العشرية.
1.25e-2
# => 0.0125
الأعداد العشرية سيئة الصيت بسبب أخطاء التقريب فيها.
0.1 + 0.2
# => 0.30000000000000004
لكن هذه الأنواع من الأخطاء ليست خاصة بـ Elixir. فهي تحدث في كل لغات البرمجة. والسبب أن كل البيانات على حواسيبنا تُخزَّن وتُعالَج ككود ثنائي. ففي النظام الثنائي، لا يمكن التعبير بدقة إلا عن الكسور التي يمكن كتابة مقامها على الصورة 2^n (مثل 1/4 و3/8 و5/16). أما الكسور الأخرى فتُعبَّر عنها بتقديرات.
# 3/4
Float.ratio(0.75)
# => {3, 4}
# 3/5
Float.ratio(0.6)
# => {5404319552844595, 9007199254740992}
يمكنك أن تتعلّم المزيد عن هذه المشكلة على 0.30000000000000004.com. وتقدّم صفحة Float Toy شرحًا بيانيًا جميلًا لكيفية تحويل بتات عدد عشري إلى قيمة عشرية فعلية.
يمكن اعتبار الأعداد الصحيحة والأعداد العشرية متساوية (==) إذا كانت لها القيمة نفسها. لكنها، لاختلاف نوعها، لا تكون متساوية تمامًا (===) أبدًا.
1 == 1.0
# => true
1 === 1.0
# => false
يمكن خلط الأعداد الصحيحة والأعداد العشرية معًا في تعبير حسابي واحد. واستخدام عدد عشري في التعبير يضمن أن تكون النتيجة عددًا عشريًا أيضًا.
2 * 3
# => 6
2 * 3.0
# => 6.0
يمكن تقريب الأعداد العشرية (round)، أو تقريبها لأعلى (ceil)، أو تقريبها لأسفل (floor).
لتقريب عدد عشري إلى عدد عشري، استخدم دوالّ من وحدة Float (Float.round، وFloat.ceil، وFloat.floor). وللحصول على عدد صحيح بدلًا من ذلك، استخدم دوالّ من وحدة Kernel (round، وceil، وfloor).
وثمة أسلوب آخر لتحويل عدد عشري إلى عدد صحيح، وهو قطع جزئه العشري باستخدام trunc.
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5