एक लेख जो मैंने Authorize.Net के लिए लिखा था :
वन प्लस वन दो के बराबर है, है ना? कैसा रहेगा .2 जमा 1.4 गुना 10? वह 16 के बराबर है, है ना? यदि आप PHP (या अधिकांश अन्य प्रोग्रामिंग भाषाओं) के साथ गणित कर रहे हैं तो नहीं:
echo floor((0.2 + 1.4) * 10); // Should be 16. But it's 15!
इसका कारण यह है कि फ्लोटिंग पॉइंट नंबरों को आंतरिक रूप से कैसे नियंत्रित किया जाता है। उन्हें दशमलव स्थानों की एक निश्चित संख्या के साथ दर्शाया जाता है और इसके परिणामस्वरूप वे संख्याएँ हो सकती हैं जो आपकी अपेक्षा के अनुरूप नहीं जुड़ती हैं। आंतरिक रूप से हमारा .2 प्लस 1.4 गुना 10 उदाहरण लगभग 15.9999999998 या उससे भी अधिक की गणना करता है। संख्याओं के साथ काम करते समय इस तरह का गणित ठीक है, जो प्रतिशत की तरह सटीक नहीं होना चाहिए। लेकिन जब पैसे की शुद्धता के साथ काम करना मायने रखता है जैसे एक पैसा या एक डॉलर यहाँ या वहाँ गायब है तो जल्दी से जुड़ जाता है और कोई भी किसी भी लापता पैसे के कम अंत में रहना पसंद नहीं करता है।
ई.पू. गणित समाधान
सौभाग्य से PHP BC Math विस्तार प्रदान करता है जो "मनमाने ढंग से सटीक गणित के लिए PHP बाइनरी कैलकुलेटर प्रदान करता है जो किसी भी आकार और परिशुद्धता की संख्या का समर्थन करता है, जिसे स्ट्रिंग के रूप में दर्शाया जाता है।" दूसरे शब्दों में, आप इस एक्सटेंशन का उपयोग करके मौद्रिक मूल्यों के साथ सटीक गणित कर सकते हैं। BC मैथ एक्सटेंशन में फ़ंक्शन शामिल है s जो आपको अतिरिक्त , घटाव , गुणा , और डिवीजन ।
एक बेहतर उदाहरण
यहां ऊपर जैसा ही उदाहरण दिया गया है लेकिन हमारे लिए गणित करने के लिए bcadd() फ़ंक्शन का उपयोग करना। इसमें तीन पैरामीटर लगते हैं। पहले दो वे मान हैं जिन्हें हम जोड़ना चाहते हैं और तीसरा दशमलव स्थानों की संख्या है जिसे हम सटीक होना चाहते हैं। चूंकि हम पैसे के साथ काम कर रहे हैं, इसलिए हम सटीकता को दो दशमलव स्थानों पर सेट करेंगे।
echo floor(bcadd('0.2', '1.4', 2) * 10); // It's 16 like we would expect it to be.