"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > क्या मैं सटीक धन गणना के लिए PHP की `php.ini` परिशुद्धता पर भरोसा कर सकता हूँ?

क्या मैं सटीक धन गणना के लिए PHP की `php.ini` परिशुद्धता पर भरोसा कर सकता हूँ?

2024-11-19 को प्रकाशित
ब्राउज़ करें:563

 Can I Rely on PHP's `php.ini` Precision for Accurate Money Calculations?

क्या मैं फ़्लोटिंग पॉइंट समस्या के लिए PHP php.ini प्रिसिजन वर्कअराउंड पर भरोसा कर सकता हूं?

परिचय

फ्लोटिंग-पॉइंट अंकगणित, एक जटिल विषय जिसे अक्सर गलत समझा जाता है, आधुनिक कंप्यूटर सिस्टम में व्याप्त है। चूंकि अधिकांश भिन्नात्मक संख्याओं में सटीक बाइनरी प्रतिनिधित्व का अभाव होता है, इसलिए पूर्णांकन अपरिहार्य रूप से होता है। फ़्लोटिंग-पॉइंट ऑपरेशंस की बारीकियों को समझना महत्वपूर्ण है, जैसा कि "फ़्लोटिंग-पॉइंट अंकगणित के बारे में प्रत्येक कंप्यूटर वैज्ञानिक को क्या पता होना चाहिए" में बताया गया है।

प्रश्न और उत्तर


प्रश्न 1: क्या मैं सटीक 2-अंकीय गणनाओं (उदाहरण के लिए, धन) के लिए सटीक समाधान का उपयोग कर सकता हूँ?

उत्तर: नहीं, आप php.ini सटीक सेटिंग्स पर भरोसा नहीं कर सकते लगातार 2-अंकीय सटीकता के लिए, यहां तक ​​कि 10^6 से नीचे की संख्याओं के लिए भी, क्योंकि गणना के दौरान सटीक लंबाई बढ़ सकती है।

प्रश्न 2: एक स्पष्ट उदाहरण प्रदान करें जहां सटीक समाधान विफल हो जाता है।

उत्तर: केवल पहले किलोग्राम पर लागू 10% छूट के साथ निम्नलिखित उदाहरण पर विचार करें:

ini_set('precision', 8); // Your precision
$a = 5.88; // Cost of 1kg
$q = 2.49; // User buys 2.49 kg
$b = $a * 0.01; // 10% Discount only on the first kg
echo ($a * $q) - $b;

आउटपुट: 14.5824

प्रश्न 3: कौन सा php.ini .सटीकता मान 2-अंकीय धन गणना के लिए उपयुक्त है?

उत्तर: PHP परिशुद्धता सेटिंग्स वित्तीय गणना या फ़्लोटिंग-पॉइंट परिशुद्धता के लिए विश्वसनीय आधार नहीं हैं। विशेष पुस्तकालयों या विधियों का उपयोग करना बेहतर है। ; $बी = 341765.07; // उदाहरण ए: परिशुद्धता = 20 प्रतिध्वनि $a - $b, PHP_EOL; //584.15999999997438863 इको फ्लोटवल(राउंड($a - $b, 2)), PHP_EOL; //584.15999999999996817 (गोलीकरण अस्थिरता का परिचय देता है) इको नंबर_फॉर्मेट ($ ए - $ बी, 2), PHP_EOL; // 584.16 इको bcsub($a, $b, 2), PHP_EOL; //584.15 // उदाहरण बी: परिशुद्धता = 14 प्रतिध्वनि $a - $b, PHP_EOL; //584.15999999997 इको फ्लोटवल(राउंड($a - $b, 2)), PHP_EOL; // 584.16 इको नंबर_फॉर्मेट ($ ए - $ बी, 2), PHP_EOL; // 584.16 इको bcsub($a, $b, 2), PHP_EOL; // 584.16 // उदाहरण सी: परिशुद्धता = 6 प्रतिध्वनि $a - $b, PHP_EOL; // 584.16 इको फ्लोटवल(राउंड($a - $b, 2)), PHP_EOL; // 584.16 इको नंबर_फॉर्मेट ($ ए - $ बी, 2), PHP_EOL; // 584.16 इको bcsub($a, $b, 2), PHP_EOL; // 584.00 // उदाहरण डी: परिशुद्धता = 3 प्रतिध्वनि $a - $b, PHP_EOL; //584 इको फ्लोटवल(राउंड($a - $b, 2)), PHP_EOL; //584 इको नंबर_फॉर्मेट ($ ए - $ बी, 2), PHP_EOL; //584.16 (सुसंगत) इको bcsub($a, $b, 2), PHP_EOL; // 0.00

ये उदाहरण सटीक गणना के लिए PHP परिशुद्धता सेटिंग्स पर भरोसा करने में विसंगतियों को प्रदर्शित करते हैं।

निष्कर्ष

$a = 342349.23;
$b = 341765.07;

// Example A: precision = 20
echo $a - $b, PHP_EOL; // 584.15999999997438863
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.15999999999996817 (rounding introduces instability)
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.15

// Example B: precision = 14
echo $a - $b, PHP_EOL; // 584.15999999997
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.16

// Example C: precision = 6
echo $a - $b, PHP_EOL; // 584.16
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.00

// Example D: precision = 3
echo $a - $b, PHP_EOL; // 584
echo floatval(round($a - $b, 2)), PHP_EOL; // 584
echo number_format($a - $b, 2), PHP_EOL; // 584.16 (consistent)
echo bcsub($a, $b, 2), PHP_EOL; // 0.00

अपडेट

ini_set('precision', 8); $ए = 0.19; $बी = 0.16; $सी = 0.01; $d = 0.01; $ई = 0.01; $f = 0.01; $जी = 0.01;

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3