त्वरित सुधार के रूप में इस प्रयास करें:
$price_int = intval(floor($price_corrected + 0.5));
समस्या आप अनुभव कर रहे पीएचपी की गलती नहीं है, चल बिन्दु arithmetics साथ वास्तविक संख्या का उपयोग करके सभी प्रोग्रामिंग भाषाओं इसी तरह के मुद्दों की है।
मौद्रिक गणना के लिए अंगूठे का सामान्य नियम कभी भी फ्लोट का उपयोग नहीं करना है (न तो डेटाबेस में और न ही आपकी स्क्रिप्ट में)। आप हमेशा डॉलर के बजाय सेंट स्टोर करके सभी प्रकार की समस्याओं से बच सकते हैं। सेंट पूर्णांक हैं, और आप उन्हें स्वतंत्र रूप से एक साथ जोड़ सकते हैं, और अन्य पूर्णांक से गुणा कर सकते हैं। जब भी आप संख्या प्रदर्शित करते हैं, तो सुनिश्चित करें कि आप पिछले दो अंकों के सामने एक बिंदु डालें।
115 के बजाय 114 क्यों प्राप्त कर रहे हैं इसका कारण यह है कि निकटतम पूर्णांक की ओर floor
राउंड नीचे, इस प्रकार मंजिल (114.9 99 99 99 99) 114 हो जाता है। अधिक दिलचस्प सवाल यह है कि 1.15 * 100 115 के बजाय 114.9 99 99 99 99 है। कारण इसके लिए यह है कि 1.15 बिल्कुल 115/100 नहीं है, लेकिन यह बहुत कम है, इसलिए यदि आप 100 से गुणा करते हैं, तो आपको 115 से थोड़ा छोटा छोटा मिलता है।
यहां एक और विस्तृत स्पष्टीकरण है echo 1.15 * 100;
करता है:
- यह एक बाइनरी फ्लोटिंग पॉइंट नंबर पर 1.15 पार्स करता है। इसमें गोलाकार शामिल है, यह 1.15 के करीब बाइनरी फ़्लोटिंग पॉइंट नंबर प्राप्त करने के लिए थोड़ा सा गोल होता है। कारण आपको सटीक संख्या (बिना त्रुटि के बिना) प्राप्त नहीं हो सकता है कि 1.15 में बेस 2 में अंकों की अनंत संख्या है।
- यह 100 बाइनरी फ़्लोटिंग पॉइंट नंबर पर पार्स करता है। इसमें गोलाकार शामिल है, लेकिन चूंकि 100 एक छोटा पूर्णांक है, गोल करने की त्रुटि शून्य है।
- यह पिछले दो संख्याओं के उत्पाद की गणना करता है। निकटतम बाइनरी फ़्लोटिंग पॉइंट नंबर खोजने के लिए इसमें थोड़ा गोल भी शामिल है। इस ऑपरेशन में राउंडिंग त्रुटि शून्य होती है।
- यह बाइनरी फ़्लोटिंग पॉइंट नंबर को एक बिंदु के साथ आधार 10 दशमलव संख्या में परिवर्तित करता है, और इस प्रतिनिधित्व को प्रिंट करता है। इसमें थोड़ा गोल भी शामिल है।
कारण है कि पीएचपी आश्चर्य की बात Corrected price = float(115)
प्रिंट (114.999 के बजाय ...) कि var_dump
सही संख्या मुद्रित नहीं करता है (!), लेकिन यह संख्या n - 2
(या n - 1
) अंक तक पूर्ण प्रिंट, जहां एन अंक गणना की सटीकता है।आप आसानी से इस की पुष्टि कर सकते हैं:
echo 1.15 * 100; # this prints 115
printf("%.30f", 1.15 * 100); # you 114.999....
echo 1.15 * 100 == 115.0 ? "same" : "different"; # this prints `different'
echo 1.15 * 100 < 115.0 ? "less" : "not-less"; # this prints `less'
आप तैरता प्रिंट कर रहे हैं, याद रखें: आप हमेशा सभी अंक नहीं दिख रहा है जब आप नाव मुद्रित करें।
PHP float दस्तावेज़ों की शुरुआत के करीब बड़ी चेतावनी भी देखें।
यह वास्तव में PHP के साथ कुछ भी नहीं है और यह करने के लिए कि सभी कंप्यूटर फ़्लोटिंग पॉइंट डेटा कैसे संभालते हैं। यदि आप पहले फ्लोटिंग पॉइंट त्रुटियों का सामना नहीं करते हैं तो आप उस विषय के बारे में पढ़ना चाहेंगे। – jmucchiello
@jmucchiello, मैं असहमत हूं। मैं समझता हूं कि कंप्यूटर्स फ़्लोटिंग पॉइंट डेटा कैसे संभालते हैं और यही कारण है कि मैं इसके बजाय पूर्णांक डेटा का उपयोग कर रहा हूं। यह एक PHP मुद्दा है क्योंकि PHP 115 दिखाता है जब अंतर्निहित डेटा स्पष्ट रूप से 114.9 99 99 999 है ... – Josh