उदाहरण:
float timeRemaining = 0.58f;
f
इस संख्या के अंत में क्यों आवश्यक है?
उदाहरण:
float timeRemaining = 0.58f;
f
इस संख्या के अंत में क्यों आवश्यक है?
double & int
।
जवाबों:
फ्लोट की आपकी घोषणा में दो भाग होते हैं:
timeRemaining
प्रकार का है float
।0.58
इस वैरिएबल को मान प्रदान करता है ।समस्या भाग 2 में होती है।
दाहिने हाथ की ओर का मूल्यांकन किया जाता है। C # विनिर्देशन के अनुसार, एक संख्या जिसमें एक दशमलव बिंदु है जिसमें एक प्रत्यय नहीं है एक के रूप में व्याख्या की गई है double
।
इसलिए अब हमारे पास एक double
मूल्य है जो हम एक प्रकार के चर को असाइन करना चाहते हैं float
। ऐसा करने के लिए, वहाँ से एक अंतर्निहित रूपांतरण होना चाहिए double
करने के लिए float
। ऐसा कोई रूपांतरण नहीं है, क्योंकि आप (और इस मामले में) रूपांतरण में जानकारी खो सकते हैं।
कारण यह है कि संकलक द्वारा उपयोग किया जाने वाला मान वास्तव में 0.58 नहीं है, लेकिन फ़्लोटिंग-पॉइंट मान 0.58 के सबसे करीब है, जो कि 0.57999999999999978655962351581366 है ... double
और बिल्कुल 0.5799999460596478271484375 के लिए float
।
कड़ाई से बोलना, f
आवश्यक नहीं है। आप f
मान का उपयोग करके प्रत्यय का उपयोग करने से बच सकते हैं float
:
float timeRemaining = (float)0.58;
(float) 0.58
काम करेंगे ? आपने पहले कहा था कि कोई रूपांतरण नहीं है, क्योंकि जानकारी खो सकती है, फिर कलाकार कैसे काम करेंगे?
2.4
की व्याख्या हर जगह एक दुसरे के रूप में की जाती है। 2. व्यापक संकीर्ण रूपांतरण (जैसे डबल से फ्लोट तक) की अनुमति नहीं है। यदि आप इन नियमों को अपवाद बनाना चाहते हैं, तो आपके पास एक बहुत अच्छा कारण होना चाहिए। 1 कुंजी स्ट्रोक को सहेजना काफी अच्छा होने की संभावना नहीं है।
क्योंकि वहाँ कई सांख्यिक प्रकार है कि संकलक मूल्य का प्रतिनिधित्व करने के लिए उपयोग कर सकते हैं 0.58
: float
, double
और decimal
। जब तक आप संकलक के साथ एक के लिए ठीक नहीं होते हैं, तब तक आपको मना करना होगा।
दस्तावेज़ में double
कहा गया है कि यदि आप स्वयं उस प्रकार को निर्दिष्ट नहीं करते हैं जो संकलक हमेशा double
किसी वास्तविक संख्यात्मक शाब्दिक के प्रकार के रूप में करता है:
डिफ़ॉल्ट रूप से, असाइनमेंट ऑपरेटर के दाईं ओर एक वास्तविक संख्यात्मक शाब्दिक रूप में दोहरा व्यवहार किया जाता है। हालाँकि, यदि आप चाहते हैं कि पूर्णांक संख्या को डबल माना जाए, तो प्रत्यय d या D का उपयोग करें।
प्रत्यय लगाना f
एक बनाता है float
; प्रत्यय d
एक बनाता है double
; प्रत्यय m
एक बनाता है decimal
। ये सभी अपरकेस में भी काम करते हैं।
हालांकि, यह समझाने के लिए अभी भी पर्याप्त नहीं है कि यह क्यों संकलन नहीं करता है:
float timeRemaining = 0.58;
जवाब की याद आ रही आधा है कि रूपांतरण से है double
0.58
करने के लिए float
timeRemaining
संभावित रूप से जानकारी खो देता है, तो संकलक यह परोक्ष लागू करने के लिए मना कर दिया। यदि आप एक स्पष्ट कास्ट जोड़ते हैं तो रूपांतरण किया जाता है; यदि आप f
प्रत्यय जोड़ते हैं तो किसी रूपांतरण की आवश्यकता नहीं होगी। दोनों मामलों में कोड फिर संकलित होगा।
int
और एक के लिए कार्यान्वयन को परेशान करना बहुत महंगा है double
।
double a = 0.69f;
?
float
को परिवर्तित करना शामिल है double
।
समस्या यह है कि .NET, कुछ प्रकार के निहित संचालन को शामिल करने की अनुमति देने के लिए , float
और इसमें double
या तो स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है कि मिश्रित परिदृश्यों को शामिल करने वाले सभी परिदृश्यों में क्या होना चाहिए या एक में प्रदर्शन किए जाने वाले प्रकारों के बीच निहित रूपांतरणों की अनुमति दें केवल दिशा; Microsoft ने उस दिशा की अनुमति देने में जावा के नेतृत्व का अनुसरण करने का विकल्प चुना, जो कभी-कभी परिशुद्धता का पक्षधर होता है, लेकिन बार-बार शुद्धता का त्याग और आम तौर पर परेशानी पैदा करता है।
लगभग सभी मामलों में, वह double
मूल्य लेना जो एक विशेष संख्यात्मक मात्रा के सबसे करीब है और इसे असाइन करने पर वह मान float
प्राप्त होगा float
जो उसी मात्रा के सबसे करीब है। कुछ कोने मामले हैं, जैसे कि मूल्य 9,007,199,791,611,905; सबसे अच्छा float
प्रतिनिधित्व 9,007,200,328,482,816 (जो कि 536,870,911 से दूर है) होगा, लेकिन सबसे अच्छा double
प्रतिनिधित्व (यानी 9,007,199,791,611,904) कास्टिंग float
9,007,199,254,740,992 (जो 536,87013 से बंद है) के लिए होगा। सामान्य तौर पर, हालांकि, double
कुछ मात्रा का सबसे अच्छा प्रतिनिधित्व परिवर्तित करने float
से या तो सर्वोत्तम संभव float
प्रतिनिधित्व प्राप्त होगा, या दो अभ्यावेदन में से एक होगा जो अनिवार्य रूप से बहुत अच्छा होगा।
ध्यान दें कि यह वांछनीय व्यवहार चरम सीमा पर भी लागू होता है; उदाहरण के लिए, float
मात्रा 10 ^ 308 के float
लिए सबसे अच्छा double
प्रतिनिधित्व उस मात्रा के सर्वश्रेष्ठ प्रतिनिधित्व को परिवर्तित करके प्राप्त किए गए प्रतिनिधित्व से मेल खाता है । इसी तरह, float
10 ^ 309 float
का सबसे अच्छा double
प्रतिनिधित्व उस मात्रा का सबसे अच्छा प्रतिनिधित्व परिवर्तित करके प्राप्त प्रतिनिधित्व से मेल खाता है ।
दुर्भाग्य से, एक स्पष्ट कलाकारों की आवश्यकता नहीं है कि दिशा में रूपांतरण शायद ही कभी कहीं भी सटीक के रूप में निकट हैं। float
मूल्य के सर्वोत्तम प्रतिनिधित्व को परिवर्तित करने double
से शायद ही कभी double
उस मूल्य के सर्वश्रेष्ठ प्रतिनिधित्व के करीब कुछ भी प्राप्त होगा , और कुछ मामलों में परिणाम परिमाण के सैकड़ों आदेशों से बंद हो सकता है (जैसे float
10 ^ 40 का सबसे अच्छा प्रतिनिधित्व परिवर्तित करने के लिए double
उपज प्राप्त कर सकते हैं) एक मान जो double
10 ^ 300 के सर्वश्रेष्ठ प्रतिनिधित्व की तुलना में अधिक है ।
काश, रूपांतरण नियम वे क्या हैं, इसलिए किसी को "सुरक्षित" दिशा में मूल्यों को परिवर्तित करते समय मूर्खतापूर्ण टाइपकास्ट और प्रत्यय का उपयोग करके जीना पड़ता है, और खतरनाक दिशा में निहित टाइपकास्ट से सावधान रहना चाहिए जो अक्सर द्विगुणित परिणाम देगा।
double
।