النقطة العائمة

في الفصل السابق واجهنا بعض المشاكل عند التعامل مع الأعداد غير الصحيحة. لقد تفادينا المشكلة بحساب النسبة المئوية بدلاً من الكسر، لكن الحل الأعم هو استعمال الأعداد العشرية، التي تستطيع التعبير عن الكسور كما تعبر عن الأعداد الصحيحة. في لغة Java، تدعى الأعداد العشرية double.
يمكنك إنشاء متغيرات عشرية وإسناد القيم لها باستخدام نفس التعليمات التي استخدمناها للأنواع الأخرى. مثلاً:
كود:
double pi;
pi = 3.14159;
كما يمكن أيضاً التصريح عن متغير وإسناد قيمة له في الوقت نفسه:
كود:
int x = 1;
String empty = "";
double pi = 3.14159;
في الواقع، هذا الأسلوب شائع جداً. أحياناً ندعو التصريح والإسناد المدمجين بالتهيئة (initialization).
على الرغم من أن الأعداد العشرية مفيدة، فهي غالباً ما تكون مصدراً للارتباك بسبب ظهور ما يشبه التداخل بين الأعداد الصحيحة والأعداد العشرية. مثلاً، إذا كانت لديك القيمة 1، فهل هي عدد صحيح، أم عدد عشري، أم الاثنين معاً؟
إذا تحدثنا بدقة، فإن Java تفرّق بين القيمة الصحيحة 1 وبين القيمة العشرية 1.0، حتى لو بدا أنهما نفس العدد، فهما يختلفان بالنوع، وعلى وجه الدقة، لا يسمح لك بالقيام بعمليات إسناد بين النوعين. مثلاً، ما يلي ليس مسموحاً:
كود:
int x = 1.1;
لأن المتغير على اليسار int والقيمة على اليمين double. لكنه من السهل نسيان هذه القاعدة، خاصة بوجود الأماكن التي تقوم فيها Java بالتحويل بين الأنواع تلقائياً. مثلاً:
double y = 1;
من المفترض تقنياً ألا تكون هذه التعليمة مشروعة، لكن Java تسمح بها عن طريق التحويل التلقائي من int إلى double. هذا التساهل مريح، لكن يمكن له أن يسبب المشاكل؛ مثلاً:
double y = 1 / 3;
قد تتوقع أن يعطى المتغير y القيمة 0.333333، وهي قيمة عشرية مشروعة، لكنه في الواقع سيعطى القيمة 0.0. السبب هو أن العبارة على اليمين هي نسبة بين عددين صحيحين، لذا تقوم Java بإجراء قسمة صحيحة، والتي تنتج القيمة الصحيحة 0. ثم يتم تحويلها إلى قيمة عشرية، الناتج هو 0.0.
إحدى الطرق لحل هذه المشكلة (بعد أن تكتشف أن هذه هي المشكلة) هو جعل الطرف الأيمن عبارة عشرية:
كود:
double y = 1.0 / 3.0;
هذا سيعطي y القيمة 0.333333، كما هو متوقع.
كل العمليات التي شاهدناها حتى الآن – الجمع، الطرح، الضرب، والقسمة – تعمل أيضاً مع القيم العشرية، مع أنك قد تكون مهتماً بمعرفة أن آلية العمل الضمنية مختلفة كلياً. في الواقع، معظم المعالجات