दशमलव को डबल में बदलें


672

मैं Track-Barएक Form'अपारदर्शिता को बदलने के लिए उपयोग करना चाहता हूं ।

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

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

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

संक्षेप में टाइप decimalकरने के लिए परिवर्तित नहीं कर सकतेdouble

मैं का उपयोग करने की कोशिश की है transऔर doubleफिर Controlकाम नहीं करता है। इस कोड ने पिछले VB.NET प्रोजेक्ट में ठीक काम किया।


11
इसके अलावा, दशमलव एक डबल के रूप में व्यापक मान का प्रतिनिधित्व नहीं कर सकता है। दशमलव केवल +/- 7.9228162514264337593543950335E + 28 तक जा सकता है; जब तक एक डबल +/- 1.79769313486232E + 308 तक जा सकता है
ट्रॉमापॉनी


8
किसी को इसे डुप्लिकेट के रूप में चिह्नित करना चाहिए।
इवान

8
@ इवान: यह SO पर कभी पूछा गया 4 वां सवाल है ...
निकोलस

1
@ निकोलस: वास्तव में। आज यहां पता लगाया गया।
जून

जवाबों:


447

doubleयह पसंद करने के लिए एक स्पष्ट कलाकार आवश्यक नहीं है:

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

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

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;

123

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


83

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

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

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

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

यही कारण है कि (double)स्पष्ट रूप से सी # में कहा गया है किया जाना है, लेकिन किया जा सकता है निहित वीबी के अधिक 'क्षमा' संकलक द्वारा।


80

5000 से क्यों बांट रहे हो? केवल 0 और 100 के बीच TrackBar के न्यूनतम और अधिकतम मान सेट करें और फिर Opacity प्रतिशत के लिए मान को 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;
}

5
क्या यह समस्या को इधर-उधर नहीं करेगा? के साथ एक समस्या के बजाय 5000, ओपी के साथ एक समस्या होगी 100?
jww

62

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

trackBar.Opacity = (double)trackBar.Value / 5000.0;

58

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

(या के बजाय) .0संख्या को जोड़ने के लिए, आप उपयोग कर सकते हैं decimal.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);

57

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


50

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

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पूर्णांक है और यह पूर्णांक विभाजन का प्रदर्शन करेगा और परिणाम पूर्णांक होगा।



47

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

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

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

this.Opacity = trackBar1.Value / 5000.0;

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

double trans = trackbar1.Value / 5000;

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



41

चूंकि Opacityएक डबल मूल्य है, मैं बस शुरू से ही एक डबल का उपयोग करूंगा और बिलकुल भी नहीं डालूंगा, लेकिन जब आप किसी भी परिशुद्धता को ढीला नहीं करते हैं तो विभाजित करते समय एक दोहरे का उपयोग करना सुनिश्चित करें

Opacity = trackBar1.Value / 5000.0;


0

इसे इस्तेमाल करे:

Opacity = decimal.ToDouble(trackBar1.Value / 5000.0);```
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.