/ / SQLite गलत अर्थ मूल्य देता है - sqlite, sqlite3

SQLite गलत arthimetic मान देता है - sqlite, sqlite3

मैं एक क्वेरी पर काम कर रहा हूं जो निम्नलिखित संख्याओं को जोड़ता है और यह एक चौंकाने वाला परिणाम लौटा रहा है।

>SELECT ((36.7300 - 20.4300) - 16.3) AS Amount;
>-3.5527136788005e-15

मैंने उन सभी चीज़ों की कोशिश की, जिन्हें मैं अलग-अलग डेटा प्रकारों के मानों को कास्टिंग करने के बारे में सोच सकता हूं, लेकिन मुझे अभी भी वही परिणाम मिल रहे हैं।

जब मैं उन चरणों को अलग कर देता हूं जो सही उत्तर देता है, लेकिन मैं किसी कारण से एक साथ काम करने के लिए दो कलात्मक कदम नहीं उठा सकता।

>SELECT 36.7300 - 20.4300 AS Amount;
>16.3

>SELECT 16.3 - 16.3 AS Amount;
>0.0

उत्तर:

उत्तर № 1 के लिए 1

ऐसा इसलिए होता है क्योंकि SQLite बेस -10 अंकगणित के बजाय द्विआधारी अंकगणित का उपयोग करता है।

वहाँ से SQLite FAQ:

(16) ROUND (9.95,1) 10.0 के बजाय 9.9 क्यों लौटता है? कंधे "टी 9.95 गोल?

SQLite द्विआधारी अंकगणित और बाइनरी में, का उपयोग करता हैलिखने का कोई तरीका नहीं है बिट्स की एक परिमित संख्या में 9.95। निकटतम आप 64-बिट IEEE फ़्लोट में 9.95 प्राप्त कर सकते हैं (जो कि SQLite उपयोग करता है) है 9,949999999999999289457264239899814128875732421875। इसलिए जब आप "9.95" टाइप करते हैं, तो SQLite वास्तव में संख्या को अधिक लंबा समझता है ऊपर दिखाया गया मान। और वह मूल्य गोल हो जाता है।

इस तरह की समस्या हर समय सामने आती हैफ्लोटिंग से निपटना बिंदु द्विआधारी संख्या। याद रखने का सामान्य नियम यह है कि अधिकांश भिन्न संख्याएँ जिनका दशमलव में एक परिमित प्रतिनिधित्व है (a.k.a) "बेस -10") बाइनरी (a.k.a) में परिमित प्रतिनिधित्व नहीं है "आधार -2")। और इसलिए उन्हें निकटतम बाइनरी का उपयोग करके अनुमानित किया जाता है नंबर उपलब्ध है। यह अनुमान आमतौर पर बहुत करीब है, लेकिन यह थोड़ा बंद हो जाएगा और कुछ मामलों में आपके परिणाम एक हो सकते हैं आप क्या उम्मीद कर सकते हैं से थोड़ा अलग।

इसका कोई सीधा समाधान नहीं है, लेकिन इस समस्या का सामना करने के लिए कई कार्य-उपाय हैं:

  • दशमलव के बिना अपनी राशि स्टोर करें और INTEGER संचालन की गणना करें
  • अपने REALs को लौटाएं और अपने गणित को डेटाबेस से बाहर करें
  • डेटाबेस से अपना परिणाम राउंड करें

यह इस बात पर निर्भर करता है कि आप अपने साथ क्या करने जा रहे हैंडेटा। उदाहरण के लिए यदि आप मुद्रा का प्रबंधन कर रहे हैं, तो आप डॉलर के बजाय सेंट में अपनी राशि जमा कर सकते हैं, लेकिन यदि आप वैज्ञानिक डेटा संग्रहीत कर रहे हैं, तो यह समाधान वैध से दूर है और आपको ऑपरेंड को पुनः प्राप्त करने और SQLite से परिणामों की गणना करने की आवश्यकता हो सकती है।