سؤال

لدي طريقة تُرجع تعويمًا مثل 1.234567890. أريد اختبار أنه يفعل ذلك حقًا. ومع ذلك ، يبدو أن هذا التعويم الذي تم إرجاعه له دقة مختلفة على منصات مختلفة ، فكيف أؤكد أن القيمة التي تم إرجاعها هي 1.23456789؟ إذا فعلت فقط:

$this->assertEqual(1.23456789, $float);

ثم قد يفشل ذلك في بعض المنصات حيث لا توجد دقة كافية.

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

المحلول

لمزيد من الدقة التي قد تفكر في استخدامها bcmath.

نصائح أخرى

حتى الآن لم يذكر أن Assertequals يدعم مقارنة العوامات من خلال تقديم دلتا لدقة التحديد:https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertequals.example2

$this->assertEquals(1.23456789, $float, '', 0.0001);

بفضل @antoine87 مشيرا: منذ phpunit 7.5 يجب أن تستخدم assertEqualsWithDelta():

$this->assertEqualsWithDelta(1.23456789, $float, 0.0001);

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

الحل 1: قارن إلى أي مدى هم. قل ، إذا كان الفرق المطلق أقل من 0.000001 ، فأنت تعامل القيم على قدم المساواة.

الحل 2: الاستخدام الرياضيات الدقة التعسفية, ، الذي يدعم أعداد من أي حجم والدقة ، ممثلة كسلاسل.

بدلاً من ذلك باستخدام BCMATH () ، يمكنك أيضًا تعيين الدقة الافتراضية ، مثل هذا:

ini_set('precision', 14);

كتحديث لإجابة @Bernhard-Wagner ، يجب عليك الآن استخدامها assertEqualsWithDelta() منذ phpunit 7.5.

$this->assertEqualsWithDelta(1.23456789, $float, 0.0001);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top