2010-06-21 6 views
6

मुझे डबल मानों के साथ समस्या है जो मुझे एंड्रॉइड होमक्ड स्क्लाइट डेटाबेस में स्टोर करने की आवश्यकता है। चूंकि ये डबल मान जीपीएस मानों का प्रतिनिधित्व करते हैं (लैट & एलएनजी), मैं वास्तव में NEED अल्पविराम के बाद 9वें नंबर पर एक पूर्ण परिशुद्धता का प्रतिनिधित्व करता हूं।SQLite में डबल मान संग्रहीत करना: परिशुद्धता सुनिश्चित करने के लिए कैसे?

अब मैं इस तरह एक मेज है:

CREATE TABLE x REAL lng; 

और की तरह sth (hardcoded) सम्मिलित करें:

INSERT INTO x lng = '1.0'; 

और जब कुछ (जावा) में इस तालिका से एलएनजी पढ़ने डबल चर, मैं "0.999956837" जैसे मान प्राप्त करें - यह मेरे लिए मूल्यों को बेकार प्रदान करता है।

मूल्यों को "पाठ" फ़ील्ड (जो महंगी महंगी बनाती है) के रूप में संग्रहीत करने के अलावा मुझे आवश्यक सटीकता को लागू करने का एक तरीका है या उन्हें पूर्णांक के रूप में संग्रहीत करना (जिसका अर्थ है कि मुझे प्रत्येक लेखन/पढ़ने पर गुणा/विभाजित करने की आवश्यकता है -OP)?

+0

बस उत्सुक है, क्या यह उद्धरण के बिना 'INSERT INTO x lng = '1.0''' के बजाय 'INSERT INTO x lng = 1.0' का उपयोग करता है, तो यह वही व्यवहार प्रदर्शित करता है? – Joubarc

+0

हाँ - मैं उद्धरणों का उपयोग करता हूं ... – xenonite

उत्तर

13

SQLite typeless है, इसका मतलब है कि सभी प्रतिनिधित्व टेक्स्ट के रूप में लिखे गए हैं, शायद रैपर एपीआई कुछ रूपांतरणों को परिवर्तित करता है जिन्हें आप नहीं जानते हैं, आपको ये परिणाम मिलते हैं।

यदि आपको स्ट्रिंग स्ट्रिंग के रूप में डेटा स्टोर करने की आवश्यकता है।

बस जब आप डबल प्रारूप को पढ़ते हैं तो सुनिश्चित करें कि आपने सही प्रारूप में सहेजा है, तो आप कॉलम पर getDouble का उपयोग कर सकते हैं।

+0

यदि आप संख्याओं को स्ट्रिंग के रूप में स्टोर करना चाहते हैं, तो आपको बिना किसी प्रकार के कॉलम घोषित करना होगा, या टेक्स्ट एफ़िनिटी ('टेक्स्ट ',' CHAR', या' CLOB') के साथ कॉल करना होगा। अन्यथा, आपके तारों को वैसे भी युगल में परिवर्तित कर दिया जाएगा। हालांकि, 15 से कम महत्वपूर्ण अंकों वाले गैर-मौद्रिक डेटा के लिए, 'डबल' पर्याप्त है। – dan04

+2

अच्छी तरह से - मुझे समस्या मिली ... यह मेरी खुद की गलती थी - मैंने getDouble() के बजाय "Cursor.getInt()" का उपयोग किया - परियोजना की शुरुआत का एक पुराना अवशेष :( – xenonite

4

double में परिशुद्धता के लगभग 17 दशमलव अंक हैं, इसलिए यदि 9 अंकों की आपको आवश्यकता है, तो कोई समस्या नहीं होनी चाहिए (मान लें कि आप उन मानों पर कोई जटिल गणना नहीं करते हैं)। बस सुनिश्चित करें कि आप कभी भी float का उपयोग करके समाप्त नहीं होते हैं, क्योंकि इसमें परिशुद्धता के केवल 7 अंक हैं।

तुम भी आप how binary floating-point works समझते हैं, और यह सुनिश्चित करना चाहिये कि वह ऐसा करेगा हमेशा परिणाम प्रतीत होता है "दौर" मूल्यों से थोड़ा दूर बनने में - जो केवल (तुम्हारा सहित) सबसे अनुप्रयोगों के रूप में लंबे समय के लिए कोई फर्क नहीं पड़ता कि यह में कहीं happes के रूप में 17 वां दशमलव अंक। उस लिंक को उन अनुप्रयोगों के विकल्पों के लिए भी देखें जहां यह महत्वपूर्ण है।

संबंधित मुद्दे