DECIMAL या NUMERIC डेटा प्रकार का उपयोग करें, FLOAT/DOUBLE नहीं
मौद्रिक मूल्यों के लिए, सटीक संख्यात्मक प्रकार (DECIMAL या NUMERIC) का उपयोग करें। FLOAT/DOUBLE बाइनरी फ्लोटिंग-पॉइंट हैं और गोलाई त्रुटियां पैदा करते हैं।
क्यों नहीं FLOAT/DOUBLE?
mysql> SELECT 0.1 + 0.2; -- 0.30000000000000004 (गलत!) mysql> SELECT CAST(0.1 AS DECIMAL(10,2)) + CAST(0.2 AS DECIMAL(10,2)); -- 0.30 (सही)
DECIMAL सिंटैक्स
DECIMAL(कुल_अंक, दशमलव_अंक) -- या NUMERIC(कुल_अंक, दशमलव_अंक) -- समान
- कुल_अंक (precision): अधिकतम अंक संख्या (1-65)
- दशमलव_अंक (scale): दशमलव बिंदु के दाईं ओर अंक (0-30, ≤ precision)
उदाहरण
1. टेबल बनाएं
mysql> CREATE TABLE MoneyStorageDemo (
-> Amount DECIMAL(10, 2) -- 8 अंक पूर्णांक, 2 दशमलव (99,999,999.99 तक)
-> );
2. मान डालें
mysql> INSERT INTO MoneyStorageDemo VALUES(50.2), (5.50), (10.4);
3. परिणाम देखें
mysql> SELECT * FROM MoneyStorageDemo;
+--------+ | Amount | +--------+ | 50.20 | | 5.50 | | 10.40 | +--------+
सामान्य पैटर्न
| उपयोग | सुझाया गया प्रकार | उदाहरण रेंज |
|---|---|---|
| मुद्रा (USD, EUR, INR) | DECIMAL(10,2) या DECIMAL(12,2) | 99,999,999.99 / 999,999,999.99 |
| क्रिप्टो/उच्च परिशुद्धता | DECIMAL(20,8) या अधिक | 0.00000001 सटीकता |
| पूर्णांक सेंट/पैसा | BIGINT (सेंट में संग्रहीत) | 922 खरब सेंट = 9.22 ट्रिलियन डॉलर |
पूर्णांक-आधारित विकल्प (कुछ मामलों में तेज़)
सभी राशियों को सबसे छोटी इकाई में पूर्णांक के रूप में संग्रहीत करें (उदाहरण: सेंट, पैसा):
-- ₹50.25 → 5025 (पैसे में) CREATE TABLE payments (amount_paise BIGINT NOT NULL); INSERT INTO payments VALUES (5025); -- प्रदर्शन: amount_paise / 100.0
नोट्स
DECIMALस्टोरेज: लगभग (precision/2) बाइट्स- गणना में सटीकता बनी रहती है
- प्रदर्शन के लिए
FORMAT(amount, 2)या एप्लिकेशन लेयर फॉर्मेटिंग उपयोग करें