दिलचस्प पोस्ट
अंगुलर हैश को कैसे जोड़ता है AngularJS में लिंक करना PHP पासवर्ड के लिए सुरक्षित हैश और नमक जावास्क्रिप्ट कोड सिर टैग में काम नहीं करता है मध्य क्लिक का उपयोग करते हुए ट्रिगर ऑनक्लिक ईवेंट मैं किसी अन्य फ़ंक्शन द्वारा प्राप्त XMLHttpRequest feedbacketext को कैसे संशोधित कर सकता हूं? प्रश्न चिह्न "क्या है?" और बृहदान्त्र ":" ऑपरेटर के लिए उपयोग किया जाता है? क्या NSString stringWithFormat में तर्क स्थिति / अनुक्रमणिका निर्दिष्ट करने का कोई तरीका है? कितने धागे बहुत अधिक हैं? JQuery के उपयोग से एचटीएमएल संस्थाओं को व्याख्या कैसे करें? एंड्रॉइड 6.0 अनुमति त्रुटि Itextsharp में ITextExtractionStrategy और LocationTextExtractionStrategy का उपयोग कर स्ट्रिंग के समन्वय प्राप्त करना एक तत्व के लिए एक लम्बाई (ऊंचाई या चौड़ाई) को शून्य से दूसरे की चर लंबाई निर्धारित करना, अर्थात कैल (एक्स – वाई), जहां y अज्ञात है एक MVC5 प्रोजेक्ट में JSON मॉडलबिंग के लिए Json.NET का उपयोग कैसे करें? कैसे चेक करें कि ऑब्जेक्ट (वेरिएबल) को आर में परिभाषित किया गया है? SQL सर्वर: डेटाबेस "पुनर्स्थापना" स्थिति में अटक गया

पीएचपी में फ्लोट की तुलना करें

मैं PHP में दो फ्लोट की तुलना करना चाहता हूं, जैसे इस नमूना कोड में:

$a = 0.17; $b = 1 - 0.83; //0.17 if($a == $b ){ echo 'a and b are same'; } else { echo 'a and b are not same'; } 

इस कोड में यह शर्त की बजाए else स्थिति का परिणाम देता है, भले ही $a और $b समान हो। PHP में फ्लोट्स को संभालने / तुलना करने के लिए कोई खास तरीका है?

यदि हां, तो कृपया मुझे इस मुद्दे को हल करने में मदद करें।

या मेरे सर्वर कॉन्फ़िग के साथ कोई समस्या है?

Solutions Collecting From Web of "पीएचपी में फ्लोट की तुलना करें"

यदि आप ऐसा करते हैं तो वे समान होनी चाहिए । लेकिन ध्यान दें कि फ़्लोटिंग-बिंदु मानों की एक विशेषता यह है कि जिन गणनाओं को एक ही मूल्य में प्रतीत होता है वास्तव में समान होना जरूरी नहीं है। इसलिए यदि $a एक शाब्दिक है .17 और $b गणना के माध्यम से वहां पहुंच जाता है, यह अच्छी तरह से हो सकता है कि वे अलग हैं, हालांकि दोनों एक ही मूल्य प्रदर्शित करते हैं

आम तौर पर आप इस तरह समानता के लिए अस्थायी बिंदु के गुणों की तुलना कभी नहीं करते हैं, आपको सबसे छोटा स्वीकार्य अंतर का उपयोग करने की आवश्यकता है:

 if (abs(($a-$b)/$b) < 0.00001) { echo "same"; } 

ऐसा कुछ।

लाल चेतावनी पहले पढ़ें http://www.php.net/manual/en/language.types.float.php समानता के लिए आपको फ्लोट की तुलना कभी नहीं करना चाहिए आपको एप्सिलॉन तकनीक का उपयोग करना चाहिए

उदाहरण के लिए:

 if (abs($a-$b) < EPSILON) { … } 

जहां EPSILON एक बहुत ही छोटी संख्या का प्रतिनिधित्व कर रहा है (आपको इसे परिभाषित करना है)

या बीसी गणित कार्यों का उपयोग करने का प्रयास करें:

 <?php $a = 0.17; $b = 1 - 0.83; //0.17 echo "$a == $b (core comp oper): ", var_dump($a==$b); echo "$a == $b (with bc func) : ", var_dump( bccomp($a, $b)==0 ); 

परिणाम:

 0.17 == 0.17 (core comp oper): bool(false) 0.17 == 0.17 (with bc func) : bool(true) 

जैसा कि पहले कहा गया है, PHP में फ्लोटिंग प्वाइंट की तुलना करते समय (चाहे बराबर, अधिक से अधिक, या कम) करते समय बहुत सावधान रहें हालांकि यदि आप केवल कुछ महत्वपूर्ण अंकों में रुचि रखते हैं, तो आप ऐसा कुछ कर सकते हैं:

 $a = round(0.17, 2); $b = round(1 - 0.83, 2); //0.17 if($a == $b ){ echo 'a and b are same'; } else { echo 'a and b are not same'; } 

2 दशमलव स्थानों (या 3 या 4) को गोलाकार का उपयोग अपेक्षित परिणाम का कारण होगा।

यदि आपके पास समता से तुलना करने के लिए फ्लोटिंग पॉइंट वैल्यू हैं, तो ओएस, भाषा, प्रोसेसर या इतने पर आंतरिक गोलाकार रणनीति के जोखिम से बचने का एक आसान तरीका है, मानों की स्ट्रिंग प्रस्तुति की तुलना करना, जैसे:

यदि (''। $ a === ''। $ b) {…}

इस तरह, आप समानता को देख सकते हैं, और PHP उत्तर आपकी इच्छाओं के बराबर होगा। यदि आप मूल्यों को पढ़ते हैं , तो यह आपके लिए बराबर है, तो उम्मीदवार के रूप में , बयान सही होगा

यदि आप इसे लिखते हैं तो यह संभवतः काम करेगा, इसलिए मैं सोचता हूं कि आपने इस प्रश्न के लिए इसे सरल बनाया है। (और सवाल सरल और संक्षिप्त रखते हुए सामान्य रूप से बहुत अच्छी बात है।)

लेकिन इस मामले में मैं सोचता हूं कि एक परिणाम एक गणना है और एक परिणाम एक निरंतर है।

यह अस्थायी बिंदु प्रोग्रामिंग का एक प्रमुख नियम का उल्लंघन करता है: समानता की तुलना कभी नहीं करें

इसके लिए कारण थोड़ा सा सूक्ष्म हैं लेकिन याद रखना महत्वपूर्ण है कि वे आम तौर पर काम नहीं करते हैं (विडंबना यह है कि, अभिन्न मूल्यों के लिए) और वैकल्पिक रूप से निम्न के साथ एक फजी तुलना है:

 if abs(a - y) < epsilon 


1. प्रमुख समस्याओं में से एक में हम कार्यक्रमों में संख्याओं को लिखते हैं। हम उन्हें दशमलव स्ट्रिंग्स के रूप में लिखते हैं, और परिणामस्वरूप हम जितने भिन्न अंश लिखते हैं, उतना मशीन अभिसरण नहीं है। उनके पास सटीक परिमित रूप नहीं है क्योंकि वे द्विआधारी में दोहराते हैं। हर मशीन का अंश x / 2 n के फार्म का एक तर्कसंगत संख्या है अब, स्थिरांक दशमलव हैं और हर दशमलव स्थिरांक x / (2 n * 5 m ) फार्म का एक तर्कसंगत संख्या है। 5 मी की संख्या अजीब है, इसलिए उनमें से किसी के लिए 2 एन कारक नहीं है। तभी जब मी == 0 अंश का द्विआधारी और दशमलव विस्तार दोनों में एक सीमित प्रतिनिधित्व होता है। तो, 1.25 सटीक है क्योंकि यह 5 / (2 2 * 5 0 ) है, लेकिन 0.1 नहीं है क्योंकि यह 1 / (2 * 5 1 ) है। वास्तव में, 1.01 श्रृंखला 1.99 में 1.99 केवल 3 संख्याएं वास्तव में प्रतिनिधित्व करती हैं: 1.25, 1.50, और 1.75।

फ्लोटिंग अंक या दशमलव संख्याओं की तुलना करने के लिए यहां समाधान है

 //$fd['someVal'] = 2.9; //$i for loop variable steps 0.1 if((string)$fd['someVal']== (string)$i) { //Same } 

string decimal चर कास्ट करें और आप ठीक हो जाएंगे।

यह PHP 5.3.27 पर मेरे लिए काम करता है

 $payments_total = 123.45; $order_total = 123.45; if (round($payments_total, 2) != round($order_total, 2)) { // they don't match } 

यदि आपके पास दशमलव अंकों की एक छोटी, सीमित संख्या है जो स्वीकार्य होगी, तो निम्नलिखित काम ठीक से (यद्यपि एप्सिलॉन समाधान की तुलना में धीमी कार्यक्षमता के साथ):

 $a = 0.17; $b = 1 - 0.83; //0.17 if (number_format($a, 3) == number_format($b, 3)) { echo 'a and b are same'; } else { echo 'a and b are not same'; } 

समानता के लिए तैरने की तुलना में एक सरल ओ (एन) एल्गोरिथम है

आपको हर फ्लोट वैल्यू को स्ट्रिंग में कनवर्ट करना होगा, फिर पूर्णांक तुलना ऑपरेटरों का उपयोग करके प्रत्येक फ्लोट स्ट्रिंग प्रस्तुति के बाईं ओर से प्रत्येक अंक की तुलना करना चाहिए। PHP प्रत्येक इंडेक्स स्थिति में तुलना से पहले एक पूर्णांक के लिए अंक को स्वायत्त करेगा। दूसरे के मुकाबले सबसे पहले अंक लूप को तोड़ देगा और फ्लोट घोषित करेगा कि यह दो से अधिक के बराबर है। औसतन, 1/2 * एन तुलना की जाएगी एक दूसरे के बराबर फ्लोट्स के लिए, एन तुलना की जाएगी। एल्गोरिथम के लिए यह सबसे खराब स्थिति है सबसे अच्छी स्थिति यह है कि प्रत्येक फ्लोट का पहला अंक अलग है, जिससे केवल एक तुलना हो।

उपयोगी परिणामों को पैदा करने के इरादे से आप कॉन्ट फ्लोट मानों पर INTEGER COMPARISON OPERATORS का उपयोग नहीं कर सकते ऐसे आपरेशनों के परिणाम का कोई अर्थ नहीं है क्योंकि आप पूर्णांक की तुलना नहीं कर रहे हैं। आप प्रत्येक ऑपरेटर के डोमेन का उल्लंघन कर रहे हैं जो व्यर्थ परिणाम उत्पन्न करता है। यह डेल्टा तुलना के लिए भी है

पूर्णांक तुलना ऑपरेटर का उपयोग करें जिसके लिए वे तैयार हैं: पूर्णांक की तुलना करें।

सरल समाधान:

 <?php function getRand(){ return ( ((float)mt_rand()) / ((float) mt_getrandmax()) ); } $a = 10.0 * getRand(); $b = 10.0 * getRand(); settype($a,'string'); settype($b,'string'); for($idx = 0;$idx<strlen($a);$idx++){ if($a[$idx] > $b[$idx]){ echo "{$a} is greater than {$b}.<br>"; break; } else{ echo "{$b} is greater than {$a}.<br>"; break; } } ?> 

मूल PHP तुलना का उपयोग करना बेहतर होगा:

 bccomp($a, $b, 3) // Third parameter - the optional scale parameter // is used to set the number of digits after the decimal place // which will be used in the comparison. 

यदि 2 ऑपरेंड समान होते हैं, तो 0 देता है 1, यदि बायां_पारदंड सही_परंद से बड़ा है, -1 अन्यथा

मुझे यह कहना नफरत है, लेकिन "मेरे लिए काम करता है":

 Beech:~ adamw$ php -v PHP 5.3.1 (cli) (built: Feb 11 2010 02:32:22) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies Beech:~ adamw$ php -f test.php a and b are same 

अब, फ्लोटिंग प्वाइंट तुलना सामान्य तौर पर मुश्किल में है – ऐसी चीजें जो आप समान होने की उम्मीद कर सकते हैं (गोल त्रुटियों और / या प्रतिनिधित्व बारीकियों के कारण)। आप http://floating-point-gui.de/ को पढ़ना चाह सकते हैं

 if( 0.1 + 0.2 == 0.3 ){ echo 'a and b are same'; } else { echo 'a and b are not same'; } 

यह आईईईई मानक फ्लोटिंग पॉइंट अंकगणित (जो इस समस्या वाला है) की वजह से समस्याएं पैदा करेगा

यहां एक उपेक्षित पीठ …

यदि आप हस्ताक्षरित फ़्लोट्स के साथ काम कर रहे हैं तो आप निकटता की जांच करने के लिए दो तुलना करना चाहेंगे:

 $a - $b < EPSILON && $b - $a < EPSILON 
 //You can compare if less or more. $parcela='250.23'; //total value $tax = (double) '15.23'; //tax value $taxaPercent=round((100*$tax)/$parcela,2); //tax percent $min=(double) '2.50';// minimum tax percent if($taxaPercent < $min ){ // tax error tax is less than 2.5 } 
 function floatcmp($f1,$f2,$precision = 10) { $e = pow(10,$precision); return (intval($f1 * $e) == intval($f2 * $e)); } 

परीक्षण का मामला

 $a = 0.17; $b = 0.17; echo floatcmp($a,$b) ? 'yes' : 'no'; // yes echo floatcmp($a,$b + 0.01) ? 'yes' : 'no'; // no 
 function compareFloats($a, $b){ list($a_int, $a_dec) = explode('.', strval($a)); list($b_int, $b_dec) = explode('.', strval($b)); if(intval($a_int) == intval($b_int) && intval($a_dec) == intval($b_dec)){ return 'same'; }else{ if((intval($a_int) < intval($b_int)) || (intval($a_int) === intval($b_int) && intval($a_dec) < intval($b_dec))){ return 'smaller'; } if((intval($a_int) > intval($b_int)) || (intval($a_int) === intval($b_int) && intval($a_dec) > intval($b_dec))){ return 'bigger'; } return 'error'; } }