किसी रूप में अस्पष्टता लागू करते समय, क्या हमें दशमलव या डबल मान का उपयोग करना चाहिए?

मैं एक फॉर्म की अस्पष्टता को बदलने के लिए ट्रैक-बार का उपयोग करना चाहता हूं।

यह मेरा कोड है:

decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;

जब मैं एप्लिकेशन बनाता हूं, तो यह निम्न त्रुटि देता है:

अंतर्निहित रूप से 'दशमलव' को 'double' में परिवर्तित नहीं कर सकता।

मैंने trans और double का उपयोग करने का प्रयास किया लेकिन फिर नियंत्रण काम नहीं करता है। यह कोड पिछले वीबी.नेट परियोजना में ठीक काम करता है।

0
जोड़ा संपादित
विचारों: 44
इसके अलावा, दशमलव एक डबल के रूप में विस्तृत मूल्य के रूप में प्रतिनिधित्व नहीं कर सकता है। दशमलव केवल +/- 7.9228162514264337593543950335E + 28 तक जा सकता है; जबकि एक डबल +/- 1.79769313486232E + 308 तक जा सकता है
जोड़ा लेखक TraumaPony, स्रोत

13 उत्तर

इस तरह डबल करने के लिए एक स्पष्ट कलाकार आवश्यक नहीं है:

double trans = (double) trackBar1.Value / 5000.0;

स्थिरता को 5000.0 (या 5000d के रूप में) के रूप में पहचानना पर्याप्त है:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
1
जोड़ा

जेनेरिक प्रश्न "डेसिमल बनाम डबल?" के लिए एक अधिक सामान्य उत्तर: परिशुद्धता को संरक्षित करने के लिए मौद्रिक गणना के लिए दशमलव </ strong>, वैज्ञानिक गणनाओं के लिए डबल </ strong> जो छोटे मतभेदों से प्रभावित नहीं होते हैं । चूंकि डबल एक प्रकार है जो सीपीयू के मूल निवासी है (आंतरिक प्रतिनिधित्व आधार 2 </ em> में संग्रहीत है), डबल प्रदर्शन के साथ गणना दशमलव के बाद बेहतर होती है (जिसे base 10 </ em> में दर्शाया गया है) आंतरिक रूप से)।

0
जोड़ा

ऐसा लगता है कि this.Opacity एक डबल मान है, और संकलक आपको उसमें दशमलव मान को क्रैक करने की कोशिश नहीं करता है।

0
जोड़ा

मेरी राय में, यह यथासंभव स्पष्ट होना वांछनीय है। यह कोड को स्पष्टता देता है और आपके साथी प्रोग्रामर को सहायता देता है जो अंततः इसे पढ़ सकते हैं।

संख्या में .0 को जोड़ने के बजाय (या इसके बजाय), आप दशमलव.ToDouble() का उपयोग कर सकते हैं।

यहाँ कुछ उदाहरण हैं:

// Example 1
double transperancy = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transperancy);

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
0
जोड़ा

आपके पास दो समस्याएं हैं सबसे पहले, अस्पष्टता को एक डबल मान की आवश्यकता नहीं है, दशमलव मान नहीं। कंपाइलर आपको बता रहा है कि दशमलव और डबल के बीच रूपांतरण होने पर, यह एक स्पष्ट रूपांतरण है जिसे आपको काम करने के लिए निर्दिष्ट करने की आवश्यकता है। दूसरा यह है कि TrackBar.Value एक पूर्णांक मान है और एक int में int int द्वारा int को विभाजित करता है इससे कोई फर्क नहीं पड़ता कि आप किस प्रकार के चर को आवंटित करते हैं। इस मामले में int से दशमलव या डबल तक एक निहित कास्ट होता है - क्योंकि जब आप कास्ट करते हैं तो परिशुद्धता का कोई नुकसान नहीं होता है - इसलिए संकलक शिकायत नहीं करता है, लेकिन आपको प्राप्त होने वाला मान हमेशा 0 होता है, संभवतः, trackBar.Value हमेशा 5000 से कम है। समाधान आपके कोड को डबल (अस्पष्टता के लिए देशी प्रकार) का उपयोग करने के लिए बदलना है और स्थिर रूप से लगातार डबल बनाकर फ़्लोटिंग पॉइंट अंकगणित करना है - जिसका प्रभाव होगा अंकगणित को बढ़ावा देना - या कास्टिंग trackBar.Value को डबल करने के लिए, जो वही काम करेगा - या दोनों। ओह, और जब तक यह कहीं और इस्तेमाल नहीं किया जाता है तब तक आपको मध्यवर्ती चर की आवश्यकता नहीं होती है। मेरा अनुमान है कि कंपाइलर इसे वैसे भी अनुकूलित करेगा, वैसे भी।

trackBar.Opacity = (double)trackBar.Value / 5000.0;
0
जोड़ा

आपका कोड VB.NET में ठीक काम करता है क्योंकि यह स्पष्ट रूप से किसी भी प्रकार का रहता है, जबकि सी # में अंतर्निहित और स्पष्ट दोनों हैं।

सी # में दशमलव से डबल तक रूपांतरण स्पष्ट है क्योंकि आप सटीकता खो देते हैं। उदाहरण के लिए 1.1 को डबल के रूप में सटीक रूप से व्यक्त नहीं किया जा सकता है, लेकिन दशमलव के रूप में (देखें " फ़्लोटिंग पॉइंट नंबर - आपके विचार से अधिक गलत" कारण के कारण)।

वीबी में आपके लिए संकलक द्वारा रूपांतरण जोड़ा गया था:

decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;

वह (डबल) को स्पष्ट रूप से सी # में बताया जाना चाहिए, लेकिन वीबी के अधिक 'क्षमाशील' कंपाइलर द्वारा implied </ em> हो सकता है।

0
जोड़ा

सबसे अच्छा समाधान है:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
0
जोड़ा

आपको 5000.0 के बजाय 5000.0 का उपयोग करना चाहिए।

0
जोड़ा

आप 5000 से विभाजित क्यों कर रहे हैं? बस 0 और 100 के बीच ट्रैकबार के न्यूनतम और अधिकतम मान सेट करें और फिर ओपेसिटी प्रतिशत के लिए मान को 100 से विभाजित करें। नीचे दिया गया न्यूनतम 20 उदाहरण फ़ॉर्म को पूरी तरह से अदृश्य होने से रोकता है:

private void Form1_Load(object sender, System.EventArgs e)
{
    TrackBar1.Minimum = 20;
    TrackBar1.Maximum = 100;

    TrackBar1.LargeChange = 10;
    TrackBar1.SmallChange = 1;
    TrackBar1.TickFrequency = 5;
}

private void TrackBar1_Scroll(object sender, System.EventArgs e)
{
    this.Opacity = TrackBar1.Value / 100;
}
0
जोड़ा

अस्पष्टता संपत्ति डबल प्रकार का है :

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

या केवल:

this.Opacity = trackBar1.Value / 5000.0;

या:

this.Opacity = trackBar1.Value / 5000d;

ध्यान दें कि मैं एक डबल विभाजन को मजबूर करने के लिए 5000.0 (या 5000d ) का उपयोग कर रहा हूं क्योंकि trackBar1.Value एक पूर्णांक है और यह एक पूर्णांक विभाजन करेगा और परिणाम एक पूर्णांक होगा ।

0
जोड़ा

मान लें कि आप WinForms, Form.Opacity का उपयोग कर रहे हैं प्रकार डबल प्रकार है, इसलिए आपको इसका उपयोग करना चाहिए:

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

जब तक आपको कहीं और मूल्य की आवश्यकता न हो, तब तक लिखना आसान होता है:

this.Opacity = trackBar1.Value / 5000.0;

जब आप अपना कोड बदलते हैं तो नियंत्रण दोहराया जाता है क्योंकि नियंत्रण था:

double trans = trackbar1.Value / 5000;

जिसने 5000 को पूर्णांक के रूप में व्याख्या की, इसलिए आपका trans मान हमेशा शून्य था। .0 को जोड़कर संख्यात्मक रूप से एक फ़्लोटिंग पॉइंट मान को स्पष्ट रूप से बनाकर संकलक अब इसे एक डबल के रूप में समझ सकता है और उचित गणना कर सकता है।

0
जोड़ा

चूंकि अस्पष्टता एक डबल मान है, इसलिए मैं केवल शुरुआत से एक डबल का उपयोग करता हूं और बिल्कुल नहीं डाला जाता, लेकिन विभाजित होने पर डबल का उपयोग करना सुनिश्चित करें ताकि आप कोई सटीकता न खोएं

Opacity = trackBar1.Value / 5000.0;
0
जोड़ा
this.Opacity = trackBar1.Value / 5000d;
0
जोड़ा