2009-12-26 7 views
18

मेरे पास एक तरीका है जो 1.234567890 की तरह एक फ्लोट देता है। मैं परीक्षण करना चाहता हूं कि यह वास्तव में ऐसा करता है। हालांकि, ऐसा लगता है कि इस लौटे हुए फ्लोट के पास विभिन्न प्लेटफॉर्म पर अलग-अलग सटीकता है, इसलिए मैं कैसे कहूं कि लौटाया गया मूल्य 1.23456789 है? अगर मैं सिर्फ कार्य करें:दशकों के साथ PHP और यूनिट परीक्षण दावे

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

तब कि कुछ प्लेटफॉर्म जहां पर्याप्त सटीक नहीं है पर असफल हो सकता है।

उत्तर

5

अधिक सटीकता के लिए आप BCMath का उपयोग करने पर विचार कर सकते हैं।

+0

bccomp() सूट मेरी स्थिति ठीक। – Tower

0
वैकल्पिक रूप से bcmath() आप भी इस तरह डिफ़ॉल्ट परिशुद्धता सेट कर सकते हैं, का उपयोग करने का

:

ini_set('precision', 14); 
3

सामान्य तौर पर, यह एक बुरा विचार समानता के लिए निर्मित तैरता परीक्षण करने के लिए है। फ़्लोटिंग पॉइंट प्रस्तुति के accuracy problems के कारण, दो अलग-अलग गणनाओं के परिणाम गणितीय रूप से पूरी तरह से बराबर हो सकते हैं, लेकिन जब आप अपने PHP रनटाइम पर तुलना करते हैं तो अलग-अलग होते हैं।

समाधान 1: तुलना करें कि वे कितने दूर हैं। कहें, यदि पूर्ण अंतर 0.000001 से कम है, तो आप मानों को बराबर मानते हैं।

समाधान 2: arbitrary precision mathematics का उपयोग करें, जो तारों के रूप में प्रतिनिधित्व किए गए किसी भी आकार और परिशुद्धता की संख्या का समर्थन करता है।

+1

+1 समानता के लिए फ्लोट का परीक्षण कभी नहीं करने के लिए। डरावना है कि कितने लोगों को इस बारे में पता नहीं है। इच्छा है कि मैं और अधिक उठा सकता है ... – sleske

+0

सही, sleske। मैंने इसे लंबे समय से अपने स्वयं के रे ट्रेसिंग प्रोग्राम लिखने के लिए सीखा है, और सोच रहा हूं कि मुझे सुंदर ढंग से जलाया बहुभुज के बजाय स्क्रीन पर कई बिंदु क्यों मिलते हैं। :-) –

43

अब तक यह उल्लेख नहीं किया गया है कि assertEquals परिशुद्धता specifiy को एक डेल्टा की पेशकश के द्वारा तैरता की तुलना का समर्थन करता है: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals.example2

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

मुझे लगता है कि आपका मतलब $-> assertEquals (1.23456789, $ float, '', 0.0001); अतिरिक्त एस नोट करें। –

+0

आप सही हैं, धन्यवाद, इसे ठीक करें। –

+0

सरल समाधानों से प्यार करें। यह स्वीकार्य होना चाहिए। स्वीकार्य समाधान मुझे बीसीएमएथ के माध्यम से एक घंटे के लिए खोदना होगा। –

संबंधित मुद्दे