उत्तर: DECIMAL डेटा प्रकार का उपयोग करें
कीमत/मुद्रा मानों के लिए कभी भी INT, FLOAT, या DOUBLE का उपयोग न करें। हमेशा DECIMAL(M, D) का उपयोग करें जो सटीक निश्चित-बिंदु अंकगणित प्रदान करता है।
क्यों FLOAT/DOUBLE खराब हैं
- फ्लोटिंग-पॉइंट बाइनरी प्रतिनिधित्व (IEEE 754) दशमलव भिन्नों को सटीक रूप से संग्रहीत नहीं कर सकता।
- उदाहरण:
0.1 + 0.2 = 0.30000000000000004(प्रोग्रामिंग भाषाओं में)। - वित्तीय गणनाओं में गोलाई त्रुटियाँ अस्वीकार्य हैं।
क्यों INT खराब है (अकेले)
- पैसे को सेंट/पैसे में संग्रहीत करना (उदाहरण: $19.99 → 1999) काम करता है लेकिन:
- अलग-अलग मुद्राओं के अलग-अलग दशमलव स्थान होते हैं (JPY 0, BHD 3, कुछ क्रिप्टो 18)।
- एप्लिकेशन को हर जगह रूपांतरण संभालना पड़ता है।
DECIMALस्वाभाविक रूप से स्केल संभालता है।
DECIMAL(M, D) सिंटैक्स
DECIMAL(M, D); -- M = कुल अंक (Precision, अधिकतम 65) -- D = दशमलव अंक (Scale, अधिकतम 30, D ≤ M)
व्यावहारिक उदाहरण
टेबल बनाना
mysql> CREATE TABLE Decimal_Demo (
Id INT NOT NULL AUTO_INCREMENT,
PRICE DECIMAL(18, 2),
PRIMARY KEY(Id)
);
बड़े मान डालना
mysql> INSERT INTO Decimal_Demo(PRICE) VALUES(99999999999999.99); mysql> INSERT INTO Decimal_Demo(PRICE) VALUES(10000000000000.99);
आउटपुट
+----+-------------------+ | Id | PRICE | +----+-------------------+ | 1 | 99999999999999.99 | | 2 | 10000000000000.99 | +----+-------------------+
सामान्य सिफारिशें
| उपयोग मामला | DECIMAL(M, D) | टिप्पणी |
|---|---|---|
| मानक मुद्रा (USD, EUR, INR) | DECIMAL(10,2) या DECIMAL(12,2) | 2 दशमलव स्थान |
| उच्च-मूल्य/बहु-मुद्रा | DECIMAL(19,4) या DECIMAL(18,2) | ERP/लेखा मानक |
| क्रिप्टोकरेंसी | DECIMAL(30,18) | 18 दशमलव तक |
| प्रतिशत/दरें | DECIMAL(5,4) | 0.0001 सटीकता |
मुख्य बिंदु
DECIMALसटीक है;FLOAT/DOUBLEअनुमानित हैं।- स्टोरेज:
DECIMALप्रति 9 अंकों पर ~4 बाइट्स उपयोग करता है। - गणना SQL में सटीक होती है:
SUM(price),price * qtyआदि। - एप्लिकेशन कोड में भी मुद्रा के लिए डेसीमल/बिगइंट लाइब्रेरी उपयोग करें।