سؤال

واجهت مشكلة من خلال إدخال أعمدة نقطة عائمة في مخطط قاعدة بيانات MySQL بأن المقارنات على قيم النقطة العائمة لا تُرجع النتائج الصحيحة دائمًا.

1 - 50.12
2 - 34.57
3 - 12.75
4 - ... (راحة أقل من 12.00)

SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"

هذا يعيدني "3".

لقد قرأت أن مقارنات قيم النقطة العائمة في MySQL هي فكرة سيئة والنوع العشري هو الخيار الأفضل.

هل لدي أي أمل في المضي قدمًا في نوع التعويم والحصول على المقارنات للعمل بشكل صحيح؟

هل كانت مفيدة؟

المحلول

هل لاحظت المشكلة أدناه؟

CREATE TABLE a (num float);

INSERT INTO a VALUES (50.12);
INSERT INTO a VALUES (34.57);
INSERT INTO a VALUES (12.75);
INSERT INTO a VALUES (11.22);
INSERT INTO a VALUES (10.46);
INSERT INTO a VALUES (9.35);
INSERT INTO a VALUES (8.55);
INSERT INTO a VALUES (7.23);
INSERT INTO a VALUES (6.53);
INSERT INTO a VALUES (5.15);
INSERT INTO a VALUES (4.01);

SELECT SUM(num) FROM a;
+-----------------+
| SUM(num)        |
+-----------------+
| 159.94000005722 | 
+-----------------+

هناك إضافي 0.00000005722 انتشر بين بعض تلك الصفوف. لذلك ستعود بعض هذه القيم كاذبة عند مقارنتها بالقيمة التي تمت تهيئتها معها.

لتجنب مشاكل مع الحساب والمقارنات الفاصلة ، يجب عليك استخدام DECIMAL نوع البيانات:

ALTER TABLE a MODIFY num DECIMAL(6,2);

SELECT SUM(num) FROM a;
+----------+
| SUM(num) |
+----------+
|   159.94 | 
+----------+
1 row in set (0.00 sec)

نصائح أخرى

واجهت القضية المماثلة مرة واحدة. تحويل حقل "تعويم" إلى "عشري". سوف يحل المشكلة بالتأكيد.

أفعل هذا

WHERE abs(value - 12.75)<0.001

لكنني أوافق على أن أي لغة يمكن أن تقارن عن المساواة العائمة ، وإذا كانت القيم المخزنة تساوي الأرقام الدقيقة التي قمت بإدراجها ، فلا ينبغي أن تكون هناك أي مشكلة

مع اثنين فقط من العشرية وقيم المطابقة الدقيقة ، لا تبدو الأخطاء الدقيقة سببًا واضحًا لمثل هذه عدم التطابق في MySQL

إنها نقطة عائمة ، فما هي المشكلة؟ 3 يمكن أن تكون النتيجة الصحيحة ، يعتمد على ما تعتقده قاعدة البيانات حوالي 12.75. هل هو 12.75 أم أكثر قليلاً؟

استخدم عشريًا إذا كنت تريد أرقامًا دقيقة.

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

مقارنة رقم مع سلسلة؟

استخدم حقيقيًا بدلاً من التعويم أو العشري.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top