2015-05-20 5 views
10

मुझे वास्तव में Prestashop के आधार पर कई वेबसाइटों (वास्तव में 3) के साथ एक बड़ी समस्या का सामना करना पड़ रहा है। समस्या यह है कि PHP या Prestashop यादृच्छिक रूप से निकटतम पूर्णांक तक कीमतों को गोल करता है और यह व्यवस्थित नहीं है।PHP - यादृच्छिक दौर व्यवहार समस्या

अधिकांश समय, यह, पूरी तरह से काम करता है के रूप में यह होना चाहिए, लेकिन कभी कभी (यह दोनों समस्याओं के बीच हफ्तों या महीनों लग जाते हैं कर सकते हैं), एक मूल्य गोल है। मेरा राउंड मोड विकल्प सही ढंग से दो दशमलव प्रदर्शित करने के लिए सेट है।

समस्या हो सकता है पीठ के कार्यालय या जब ग्राहक चेकआउट विकल्प पर है में एक उत्पाद की कीमत को संपादित करते समय।

मैं इस समस्या पुन: पेश करने की कोशिश की, तो मैं एक बुनियादी परीक्षण बनाया: मैं एक गाड़ी में जानकारी प्राप्त और मैं इसकी कीमत प्रदर्शित करते हैं। मैंने पृष्ठ को कई बार ताज़ा किया और मैंने देखा कि कीमत केवल कुछ बार गोल है। सबसे दिलचस्प बात यह है कि न तो संदर्भ और न ही कोड की शुरुआत और अंत के बीच कोड बदल गया है।

मैं गूगल पर मदद के लिए खोज की है और कोई भी इस समस्या के लिए लग रहा था ...

कोई इस समस्या का सामना किया था? क्या आपको लगता है कि यह एक PHP मुद्दा या Prestashop एक है? आपकी सहायता के लिये पहले से ही धन्यवाद।

round($value, 2, PHP_ROUND_HALF_UP); 

जानकारी के लिए, पीएचपी 5.4.39 के संस्करण:

यहाँ दौर समारोह Prestashop उपयोग कर रहा है के कोड है।

+0

http://php.net/round - 4 राउंडिंग विधियां हैं। Prestashop के कोड के माध्यम से grep यह देखने के लिए कि वे किस (ओं) का उपयोग कर रहे हैं। –

+0

@MarcB आपके सुझाव के लिए धन्यवाद, मैंने अपने प्रश्न को प्रेस्टैशॉप द्वारा उपयोग किए गए फ़ंक्शन के साथ अपडेट किया है। – Sebj

उत्तर

1

2 साल से अधिक के बाद, हमने इस मुद्दे को समझ लिया। यह php5-fpm के कारण था जो प्रत्येक थ्रेड को प्रतिस्थापित करता है लेकिन प्रति प्रक्रिया नहीं करता है। यह PHP documentation में वास्तव में स्पष्ट है:

चेतावनी स्थानिक जानकारियां धागा प्रति नहीं, प्रक्रिया के अनुसार बनाए रखा है। यदि आप विंडोज़ पर आईआईएस, एचएचवीएम या अपाचे जैसे मल्टीथ्रेडेड सर्वर एपीआई पर PHP चला रहे हैं, तो आपको स्क्रिप्ट चलने के दौरान लोकेल सेटिंग्स में अचानक बदलाव का अनुभव हो सकता है, हालांकि स्क्रिप्ट को कभी भी सेटलोकेल() नहीं कहा जाता है। यह एक ही समय में एक ही प्रक्रिया के विभिन्न धागे में चल रही अन्य स्क्रिप्ट के कारण होता है, सेटलोकेल() का उपयोग कर प्रक्रिया-व्यापी लोकेल को बदलता है।

क्योंकि दशमलव विभाजक बदल गया है, PHP दशमलव को पहचान नहीं पाया और मेरी संख्या को छोटा कर दिया।

0

हो सकता है कि वहाँ एक समस्या कीमत 12,300.20 की तरह एक हजार विभाजक है अगर है?

नोट::

कृपया ध्यान निम्न होना PHP जैसे "12,300.2" सही ढंग से डिफ़ॉल्ट रूप से तार संभाल नहीं करता है। तारों से कनवर्ट करना देखें।

देखें: http://php.net/round

0

मैं लगभग निश्चित है इसकी कैसे चल बिन्दु संख्या आपके कंप्यूटर या कुछ और उन पंक्तियों के साथ भीतर जमा हो जाती है हूँ, कि आप सही दिशा में बात कर सकते हैं।

http://php.net/manual/en/language.types.float.php

इस चेक बाहर के साथ-साथ, के बारे में क्यों चल बिन्दु संख्या हमेशा समान नहीं है जब आपको लगता है उन्हें करना चाहिए समझा। http://docstore.mik.ua/orelly/webprog/pcook/ch02_03.htm#phpckbk-CHP-2-SECT-3

0

वहाँ स्थानों के साथ मुद्दों हो सकता है। उदाहरण के लिए जर्मन में हजारों विभाजक और दशमलव बिंदु दूसरी तरफ हैं। यदि आप उन लोगों को संभालने में बहुत सावधान नहीं हैं, तो आप कुछ स्थिरता में गलत मूल्यों को स्टोर कर सकते हैं या फ़्लोट करने के लिए इसे कास्ट करते समय कुछ मूल्य तोड़ सकते हैं। याद रखें - जब तारों के साथ गणना (उदाहरण: "2.55") php उन्हें फ्लोट करने के लिए डालेगा, जर्मन नंबरों ("2,55") को संभालने के परिणामस्वरूप गलत फ़्लोटिंग पॉइंट नंबर होगा।

(float) "2.55" = 2.55 
(float) "2,55" = 2 

समस्या को स्थानीय रूप से कॉन्फ़िगर करके ठीक किया जा सकता है।

आप स्वचालित रूप से एक वैध से एक गलत परिणाम बताने के लिए सक्षम हैं, तो आप उस बिंदु पर debug_backtrace लॉग इन करने के कार्यक्रमों उस मामले में प्रवाह का मूल्यांकन कर सकते हैं।

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