MySQL में FLOAT और DOUBLE फ्लोटिंग-पॉइंट प्रकार हैं जो परिशुद्धता समस्याएं पैदा कर सकते हैं। सटीक दशमलव मानों (विशेषकर वित्तीय डेटा) के लिए DECIMAL(precision, scale) का उपयोग करें।
समस्या: FLOAT परिशुद्धता
mysql> CREATE TABLE test_float (val FLOAT);
mysql> INSERT INTO test_float VALUES (0.1), (0.2), (0.3);
mysql> SELECT * FROM test_float;
+-------+
| val |
+-------+
| 0.1 |
| 0.2 |
| 0.3 |
+-------+
mysql> SELECT SUM(val) FROM test_float;
+--------------------+
| SUM(val) |
+--------------------+
| 0.6000000238418579 | -- 0.6 नहीं!
+--------------------+
समाधान: DECIMAL उपयोग करें
सिंटैक्स
DECIMAL(precision, scale)
-- precision: कुल अंक (1-65)
-- scale: दशमलव के बाद के अंक (0-30, precision ≤ scale)
व्यावहारिक उदाहरण
mysql> CREATE TABLE DemoTable (Amount DECIMAL(10,2));
Query OK, 0 rows affected (0.54 sec)
mysql> INSERT INTO DemoTable VALUES
(2194848.90), (90309393.79), (8999999.68), (90900000.99);
Query OK, 4 rows affected (0.25 sec)
mysql> SELECT * FROM DemoTable;
+-------------+
| Amount |
+-------------+
| 2194848.90 |
| 90309393.79 |
| 8999999.68 |
| 90900000.99 |
+-------------+
4 rows in set (0.00 sec)
mysql> SELECT SUM(Amount) FROM DemoTable;
+-----------------+
| SUM(Amount) |
+-----------------+
| 191407843.36 | -- सटीक!
+-----------------+
DECIMAL vs FLOAT/DOUBLE
| विशेषता | DECIMAL | FLOAT/DOUBLE |
| संग्रहण | सटीक निश्चित-बिंदु | सन्निकट फ्लोटिंग-पॉइंट |
| परिशुद्धता | सटीक (निर्दिष्ट स्केल तक) | गोलाई त्रुटियाँ संभव |
| सीमा | 65 अंक तक | बहुत बड़ी सीमा |
| प्रदर्शन | थोड़ा धीमा | तेज़ (हार्डवेयर समर्थन) |
| उपयोग मामला | पैसा, माप, सटीक गणना | वैज्ञानिक, सांख्यिकीय, ग्राफिक्स |
सामान्य DECIMAL परिभाषाएँ
| उपयोग | परिभाषा | सीमा |
| मुद्रा (2 दशमलव) | DECIMAL(10,2) | -99,999,999.99 से 99,999,999.99 |
| मुद्रा (4 दशमलव) | DECIMAL(15,4) | विनिमय दरों के लिए |
| प्रतिशत | DECIMAL(5,2) | -999.99% से 999.99% |
| निर्देशांक | DECIMAL(10,7) | GPS निर्देशांक |
| बड़ी मात्रा | DECIMAL(20,2) | कॉर्पोरेट वित्त |
मौजूदा FLOAT कॉलम को DECIMAL में बदलें
-- 1. नया कॉलम जोड़ें
ALTER TABLE DemoTable ADD Amount_decimal DECIMAL(10,2);
-- 2. डेटा कॉपी करें (सावधानी: फ्लोट त्रुटियाँ आ सकती हैं)
UPDATE DemoTable SET Amount_decimal = ROUND(Amount, 2);
-- 3. सत्यापित करें
SELECT Amount, Amount_decimal FROM DemoTable;
-- 4. स्विच करें
ALTER TABLE DemoTable DROP COLUMN Amount;
ALTER TABLE DemoTable CHANGE Amount_decimal Amount DECIMAL(10,2);
सर्वोत्तम अभ्यास
- पैसे के लिए हमेशा DECIMAL - कभी भी FLOAT/DOUBLE न उपयोग करें
- पर्याप्त precision चुनें (अधिकतम अपेक्षित मान + 2)
- एप्लिकेशन लेयर पर भी DECIMAL/BigDecimal उपयोग करें
- JSON में संख्याओं को स्ट्रिंग के रूप में भेजें