2016-06-24 11 views
5

जैसा कि कई स्थानों (जैसे Why can't decimal numbers be represented exactly in binary?) में बताया गया है, सभी दशमलव अंशों को फ़्लोटिंग पॉइंट मानों के रूप में प्रदर्शित नहीं किया जा सकता है (जैसे जावा में float में संग्रहीत)।जावा राउंड-ट्रिप स्ट्रिंग कैसे हो सकता है -> फ्लोट -> स्ट्रिंग भी कुछ (कुछ) मानों के लिए एक फ्लोट के रूप में प्रतिनिधित्व योग्य नहीं है?

दिया गया सामान्य उदाहरण "0.2" है। इस निफ्टी IEEE 754 Converter के मुताबिक, float 0.2 से निकटतम 0.20000000298023224 है, इसलिए float के रूप में "0.2" को पार्स करना इस परिणाम को प्राप्त करना चाहिए।

हालांकि, मैं ने कहा कि जावा असंभव ऐसा करने में सक्षम हो रहा है:

String number="0.2"; 
float f = Float.parseFloat(number); 
System.out.println("Result of roundtrip String -> float -> String: "+f); 

प्रिंट:

गोल यात्रा स्ट्रिंग का परिणाम -> नाव -> स्ट्रिंग: 0.2

Test on IDeone.com

जावा कैसे जानता है कि मैं चाहता था ऊपर वर्णित अनुसार "0.20000000298023224" सटीक आउटपुट के बजाय (गोलाकार) आउटपुट "0.2"?

यह समझाने के लिए Javadocs of Float.toString() कोशिश:

कितने अंक मीटर या एक का आंशिक भाग के लिए मुद्रित किया जाना चाहिए? आंशिक भाग का प्रतिनिधित्व करने के लिए कम से कम एक अंक होना चाहिए, और जितना अधिक है, लेकिन पर जितने अधिक अंक हैं, उतनी ही अधिक संख्या फ़्लोट के आसन्न मूल्यों से तर्क मान को विशिष्ट रूप से अलग करें।

दुर्भाग्य से, यह मुझे और भी भ्रमित करता है। "तर्क मान को विशिष्ट रूप से अलग करने के लिए जितने आवश्यक अंकों को प्रिंट करना" जावा को "0.2" प्रिंट करने की अनुमति देता है?

आदर्श रूप से, उत्तर क्यों समझाएगा यह प्रिंटिंग एल्गोरिदम चुना गया था। यह इस उदाहरण में, (कुछ) राउंड-ट्रिप काम करना है? क्या कोई और प्रेरणा है?

+1

जब आपको उसकी आवश्यकता होती है तो जॉन स्कीट कहां है? क्या उसने ब्रेक्सिट किया था? – GhostCat

+0

आप जानते हैं कि 0.21 या 0.2000001 दर्ज करने या कुछ भी इसी तरह के 0.2 लौटाता है? Http://stackoverflow.com/questions/17464675/convert-string-to-decimal-number-with-2-decimal-places-in-java – mylenereiners

+0

देखें 7 शून्य, 10^7 = 2^23 इसलिए शायद 4 बाइट फ्लोट के 3 बाइट मंथिसा पहुंचे हैं। तो यहां यह अभी भी नियमित हो सकता है। यह अक्सर सी और सी ++ होता है जो अच्छे परिणाम (मेरी इंप्रेशन) के लिए थोड़ा सा धोखा देता है। –

उत्तर

1

मुझे लगता है कि 0.2 "Value Set Conversion" से संबंधित है।

+0

एचएम, मुझे लगता है कि यह है एक अलग (हालांकि संबंधित) क्षेत्र। वैल्यू सेट रूपांतरण एफपी गणनाओं में इंटरमीडिएट परिणामों पर लागू होते हैं, रूपांतरणों के लिए नहीं। – sleske

+0

उसी पृष्ठ के §5.2 को देखें। – mauretto

2

आउटपुट का गोलाकार कुछ प्रिंटिंग एल्गोरिदम की वजह से नहीं है। यह float के आकार की वजह से है। यदि आप कार्य करें:

String fs = "0.2"; 
double f = Float.parseFloat(fs); 
System.out.println(f); 

आप मिल:

0,20000000298023224

Test on Ideone.com

यह स्पष्ट रूप से पता चलता है कि स्ट्रिंग "0.2" .20000000298023224 के रूप में पार्स किया गया है, लेकिन नाव डेटा -टाइप इसे पकड़ने में सक्षम नहीं है, और इसे 0.2 तक गोल करता है। double डेटा प्रकार इस डेटा को रखने में सक्षम है, और इसलिए, जब आप इसे फ्लोट के रूप में पार्स करते हैं, लेकिन इसे डबल में संग्रहीत करते हैं, तो आपको अपेक्षित आउटपुट मिलता है।

+0

जब मैंने इसे डबल के रूप में पार्स किया, तो इसके परिणामस्वरूप 0.2 – 4castle

+0

नंबर मेरे आईडीई पर यह है। रुको, मैं आपको दिखाने के लिए ऑनलाइन कोशिश करूंगा। – Hackerdarshi

+0

@ 4castle इसे देखें: http://ideone.com/sjWAZS – Hackerdarshi

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