2012-10-04 7 views
10

है, मेरे पास निम्नलिखित नमूना है (link to ideone)।एक स्ट्रिंग को कनवर्ट करना जिसमें दशमलव 0 लंबे समय तक

long lDurationMillis = 0; 
lDurationMillis = Long.parseLong("30000.1"); 
System.out.print("Play Duration:" + lDurationMillis); 

यह एक अपवाद फेंकता है:

Exception in thread "main" java.lang.NumberFormatException: For input string: "30000.1" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
at java.lang.Long.parseLong(Long.java:419) 
at java.lang.Long.parseLong(Long.java:468) 
at Main.main(Main.java:9) 

लेकिन क्यों यह अभ्यस्त मुझे एक स्ट्रिंग सीधे करने के लिए उस नंबर बदलने देते मैं पूर्णांक और संख्या में बदल सकते हैं दोगुना करने के लिए परिवर्तित की तुलना में?। लेकिन क्या कोई और तरीका है?

+0

क्यों 'Double.parseDouble (पाठ) के साथ एक' double' के लिए सीधे दशमलव परिवर्तित नहीं; 'या के साथ एक BigDecimal के लिए 'नया बिगडिसीमल (टेक्स्ट);' –

+0

शीर्षक कहता है कि स्ट्रिंग को लंबे समय तक परिवर्तित करना, पहला सवाल स्ट्रिंग के लिए नंबर को कवर करने के बारे में है, स्ट्रिंग के लिए संख्या को पूर्णांक में बदलने के बारे में अगला कथन। मैं उलझन में हूं –

+0

स्पष्ट नहीं है कि आपका क्या मतलब है। उदाहरण के लिए, आप 'Long.toString (long l) 'के साथ किसी भी संख्या को' स्ट्रिंग 'में परिवर्तित कर सकते हैं। –

उत्तर

27

मूल्य 30000.1 गलत लंबे मूल्य है अनदेखी करने के लिए इसे कास्ट करने के लिए परिवर्तित कर सकते हैं। आप डबल मूल्य पहले पार्स सकता है:

lDurationMillis = (long)Double.parseDouble("30000.1"); 
+1

मैंने पढ़ा है कि 'डबल' डेटा प्रकार का उपयोग कर सटीक त्रुटियों का कारण बन सकता है। क्या यह यहां नहीं हो सका? – Patrick

+0

'parseDouble' चरित्र रूपांतरण द्वारा एक बहुत सटीक चरित्र करता है इसलिए नहीं – Reimeus

2

क्योंकि लंबे आंशिक हिस्सा नहीं हो सकता है, आप इसे दोगुना और फिर लंबे समय आंशिक हिस्सा

2

इस मामले में आपको BigDecimal इस्तेमाल कर सकते हैं:

BigDecimal bd = new BigDecimal("30000.1"); 
long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue(); 
System.out.println(l); 
4

शीर्षक लंबे, पहला सवाल करने के लिए स्ट्रिंग परिवर्तित स्ट्रिंग के लिए संख्या coverting, के बारे में अगले स्टेटमेंट के बारे में है कहते हैं स्ट्रिंग के लिए संख्या को पूर्णांक में कनवर्ट करना। मैं दुविधा में हूं।

लेकिन फ्लोटिंग पॉइंट्स के साथ कुछ भी करने के लिए, मुझे आपको अनिवार्य संदर्भ What Every Computer Scientist Should Know About Floating-Point Arithmetic पर इंगित करना होगा।

जावा में, int और long आंशिक भागों की जरूरत नहीं है, इसलिए 3000.1 इस तरह की स्ट्रिंग इनमें से किसी एक को covnerted नहीं किया जा सकता। इसे float या double में परिवर्तित किया जा सकता है, लेकिन यदि आप उपरोक्त आलेख को पढ़ते हैं तो आपको पता चलेगा कि कवरेज हानिकारक हो सकता है, यानी यदि आप double को String पर वापस कर सकते हैं तो आपको मूल 3000.1 वापस नहीं मिल सकता है। बंद होने के उचित निर्धारण के लिए यह कुछ करीब होगा, लेकिन ऐसा नहीं हो सकता है।

यदि आप सटीक परिशुद्धता का उपयोग करना चाहते हैं तो BigDecimal आपका मित्र है। यह संख्या प्रकार के बाद बहुत धीमी होगी, लेकिन यह सटीक होगा।

1

आप कर सकते हैं आप NumberFormat यानी

long lDurationMillis = 0; 
     try{ 
      NumberFormat nf = NumberFormat.getInstance(); 
      lDurationMillis = nf.parse("30000.1").longValue(); 
      System.out.print("Play Duration:" + lDurationMillis); 
     }catch(ParseException e) 
     { 
      e.printStackTrace(); 
     } 

आउटपुट:

Play Duration:30000 
संबंधित मुद्दे