"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تعتبر مقارنات الفاصلة العائمة في MySQL غير دقيقة؟

لماذا تعتبر مقارنات الفاصلة العائمة في MySQL غير دقيقة؟

تم النشر بتاريخ 2024-11-20
تصفح:264

Why are Floating-Point Comparisons in MySQL Inaccurate?

تحديات مقارنة النقاط العائمة في MySQL

غالبًا ما يواجه مستخدمو MySQL معلومات غير دقيقة عند مقارنة قيم الفاصلة العائمة. خذ بعين الاعتبار المثال التالي:

CREATE TABLE users (points float);
INSERT INTO users VALUES (50.12);
INSERT INTO users VALUES (34.57);
INSERT INTO users VALUES (12.75);

الاستعلام SELECT COUNT(*) FROM users حيث تشير النقاط > "12.75" إلى 3، على الرغم من توقع العدد 2.

&&&]المشكلة باستخدام حساب النقطة العائمة

يستخدم MySQL حساب النقطة العائمة لتخزين و التعامل مع قيم النوع العائم. يمثل هذا النظام الأرقام باستخدام مزيج من الدلالة (الرقم الفعلي) والأس، مما يؤدي إلى مشكلات محتملة في الدقة. على سبيل المثال، قد يتم تخزين القيمة 12.75 كـ 12.75000005722 عند إدخالها في MySQL بسبب التمثيل الثنائي لأرقام الفاصلة العائمة.

التمثيل العشري الدقيق

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

التحويل إلى DECIMAL

لتحويل عمود عائم موجود إلى DECIMAL، استخدم ALTER TABLE. البيان:

تعديل مستخدمي الجدول تعديل النقاط DECIMAL (6،2)؛
ALTER TABLE users MODIFY points DECIMAL(6,2);
سيؤدي هذا إلى تحويل النقاط إلى عمود عشري يتكون من 6 أرقام إجمالية ومنزلتين عشريتين. يمكنك ضبط الدقة والمقياس حسب الحاجة.

الاستنتاج على الرغم من أن التعويم قد يبدو مناسبًا، إلا أن عدم الدقة المتأصلة في حساب النقطة العائمة يمكن أن يؤدي إلى نتائج غير متوقعة عند المقارنة. قيم. للحصول على تمثيل عشري دقيق ومقارنات دقيقة، يوصى بشدة باستخدام نوع البيانات DECIMAL في MySQL. باستخدام DECIMAL، يمكنك تجنب المخاطر المحتملة لمقارنات الفاصلة العائمة وضمان موثوقية بياناتك.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3