6

मैं सेंसर रीडिंग से टाइमस्टैम्प मान पढ़ रहा हूं, लेकिन चूंकि उन्हें नैनोसेकंड में प्रदान किया गया है, मैंने सोचा कि मैं उन्हें दोगुना कर दूंगा और रूपांतरण कर दूंगा। परिणामस्वरूप संख्या 17 अंकों का मूल्य है, साथ ही विभाजक।दशमलव स्वरूप के बिना वैज्ञानिक नोटेशन के प्रिंट करने के लिए प्रारूपण डबल

इसे मुद्रित करने का प्रयास सीधे वैज्ञानिक नोटेशन में होता है, जो मैं नहीं चाहता, इसलिए मैं इसे दशमलव दशमलव वर्ग का उपयोग 4 दशमलव स्थानों के अनुमानित मूल्य पर आउटपुट करने के लिए करता हूं। समस्या यह है कि, हालांकि, डीबगर कई 17 दशमलव अंक दिखाता है, भले ही 'डबलवैल्यू()' कॉल के बाद भी, आउटपुट स्ट्रिंग मुझे 15 अंकों को दिखाती है।

कोड:

... 
Double timestamp = (new Date().getTime()) +  // Example: 1.3552299670232847E12 
      ((event.timestamp - System.nanoTime())/1000000D); 
DecimalFormat dfmt = new DecimalFormat("#.####"); 

switch(event.sensor.getType()){ 
    case Sensor.TYPE_LINEAR_ACCELERATION: 
    case Sensor.TYPE_ACCELEROMETER: 
     accel = event.values.clone(); 
     String line = "A" + LOGSEPARATOR +    
      dfmt.format(timestamp.doubleValue()) + // Prints: 1355229967023.28 
... 

मुझे लगा कि यह एक Android सटीक समस्या हो सकती है, लेकिन डिबगर गलत परिशुद्धता के साथ-साथ दिखा फ़ॉर्मेटर है। मैंने इसे स्थानीय जावा प्रोग्राम में परीक्षण किया है और दोनों कॉलों में समान अंक हैं।

क्या यह एक दशमलव फ़ार्मेट बग/सीमा है? या मुझ से कुछ गलत हो रहा है?

+1

आपका समस्या यह है कि संख्या स्वरूप में फिट नहीं करता है:

यह संशोधित कोड का उपयोग कर रहा समाप्त हो गया है। प्रयत्न "##############।####"। –

+0

मैंने तब भी कोशिश की, लेकिन अगर मैं भूल गया था तो वैसे भी जांच की गई। एक प्रारूप "####################### (" 7 अतिरिक्त अंकों के साथ) एक ही परिणाम नेट। – ravemir

+0

क्या आप DecimalFormat या Android एक के java.util संस्करण का उपयोग कर रहे हैं? –

उत्तर

1

जावा और एंड्रॉइड के डेसिमलफॉर्मैट क्लास के बीच वास्तव में एक अंतर है, और सटीक समान तर्क लेने के बावजूद वे अलग-अलग परिणाम आउटपुट करते हैं।

हेनरी के दृष्टिकोण को आजमाने के लिए यह मेरे लिए पर्याप्त था, और अब जब मैंने देखा है कि मैंने परिशुद्धता के अतिरिक्त 2 स्थान प्राप्त किए हैं। मुझे यह भी विश्वास है कि मूल्यों की गणना सटीक रूप से की जाती है, क्योंकि केवल रकम और गुणा शामिल होते हैं।

... 
long javaTime = new Date().getTime(); 
long nanoTime = System.nanoTime(); 
long newtimestamp = javaTime * 1000000 +   // Compute the timestamp 
      (event.timestamp - nanoTime);   // in nanos first 
String longStr = Long.valueOf(newtimestamp).toString(); 
String tsString = longStr.substring(0, longStr.length()-6) +// Format the output string 
      "." + longStr.substring(longStr.length()-6); // to have the comma in the 
                  // correct space. 
... 
0

स्ट्रिंग.फॉर्मैट के साथ कुछ शोध एक ही परिणाम के साथ कुछ शोध कर रहा था।

Double timestamp = 1.3552299670232847E12; 
System.out.println("it was " + timestamp); 
System.out.println("and now " + String.format("%.4f", timestamp)); 

और यह उत्पादन होता है:

12-12 15:48:58.255: I/System.out(2989): it was 1.3552299670232847E12 
12-12 15:48:58.255: I/System.out(2989): and now 1355229967023,2800 

हो सकता है कि तुम सही हो और यह एक Android सटीक समस्या है के रूप में यदि आप इसे जावा में कोशिश, उत्पादन सही है: http://ideone.com/PBOiet

मैं 'googling रखेंगे ...

+0

कोई नया निष्कर्ष नहीं? – ravemir

2

जावा में एक डबल में केवल 52 बिट की एक मंथिसा है (छुपा 1 इसकी 53 बिट)। यह 15-16 दशमलव स्थानों के बराबर है (53 ​​* लॉग 10 (2))। इसके बाद प्रत्येक अंक यादृच्छिक है और इसलिए यह रूपांतरण कार्य को 15 दशमलव स्थानों के बाद आउटपुट में कटौती करने के लिए समझ में आता है।

चूंकि आपको बड़ी संख्या में दी जाने वाली बड़ी संख्या की आवश्यकता नहीं है, इसलिए मूल्य को लंबे समय तक क्यों न रखें? यह आपको 63 महत्वपूर्ण बिट्स (संकेत के लिए 64 -1) देगा।

+0

यह मेरा तर्क था: मुझे दो लम्बाई के साथ गणना की गई, नैनोसेकंड को मिलीसेकंड में परिवर्तित करने की आवश्यकता है। लेकिन मैंने दूसरे तरीके से नहीं सोचा था: नैनोसेकंड में मिलीसेकंड बदलना, जिसके लिए फ्लोटिंग पॉइंट डेटा की आवश्यकता नहीं है। इस तरह से मैं लंबे समय से परिशुद्धता रख सकता हूं और इसे प्रिंट करने के दौरान मुझे 6 स्थानों पर कॉमा को बाईं ओर ले जाने की आवश्यकता है। मुझे इसका परीक्षण करने दो और मैं आपसे वापस आऊंगा। – ravemir

+0

यह काम किया! न केवल मुझे दो अन्य स्थान मिले, बल्कि एक अतिरिक्त 2 भी। अजीब बात यह है कि, मैं उम्मीद कर रहा था कि पिछली विधि के साथ गणना की गई अंतिम दो वर्ण केवल यादृच्छिक संख्याएं थीं, लेकिन वे मेरे नए गणना वाले लंबे मूल्य के अंदर से मेल खाते हैं। – ravemir

+0

मैं आपको बक्षीस दूंगा और अपना स्वयं का उत्तर स्वरूपित करूंगा। मैं मूर्खतापूर्ण महसूस करता हूं, हालांकि, क्योंकि मैंने ऐसा कुछ करने का सोचा था, लेकिन परेशान नहीं था/सोचा था कि यह डोडी था। – ravemir

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

  • कोई संबंधित समस्या नहीं^_^