দশমিককে দ্বিগুণ রূপান্তর করুন


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
@ ইভান: এটি এখনও জিজ্ঞাসা করা চতুর্থ প্রশ্ন ...
নিকোলাস

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 এ দুর্দান্ত কাজ করেছে কারণ এতে স্পষ্টত কোনও ক্যাসেট থাকে, যখন সি # তে অন্তর্ভুক্ত এবং স্পষ্টত উভয়ই থাকে।

সি # তে আপনি যথার্থতা হারাতে দশমিক থেকে দ্বিগুণ রূপান্তর সুস্পষ্ট। উদাহরণস্বরূপ, ১.১ ডাবল হিসাবে সঠিকভাবে প্রকাশ করা যায় না, তবে দশমিক হিসাবে ( কারণ "কারণ হিসাবে" ভাসমান পয়েন্ট সংখ্যাগুলি - আপনি যা ভাবেন তার চেয়ে বেশি ভুল "দেখুন)।

ভিবিতে রূপান্তরটি আপনার জন্য সংকলক যুক্ত করেছিলেন:

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

যে (double)স্পষ্টভাবে সি # বিবৃত করা হয়েছে, কিন্তু করা যাবে উহ্য ভিবি এর আরো 'ক্ষমা' কম্পাইলার দ্বারা।


80

আপনি 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;
}

5
এটি কি কেবল সমস্যাটি ঘুরিয়ে দেবে না? পরিবর্তে সমস্যা ছাড়া 5000, ওপিতে সমস্যা হবে 100?
jw

62

আপনার দুটি সমস্যা আছে। প্রথমত, Opacityএকটি দশমিক মান নয়, একটি ডাবল প্রয়োজন। সংকলক আপনাকে জানিয়ে দিচ্ছে যে দশমিক ও দ্বিগুণের মধ্যে রূপান্তর হওয়ার সময় এটি স্পষ্ট রূপান্তর যা আপনাকে কাজ করার জন্য নির্দিষ্ট করতে হবে specify দ্বিতীয়টি হ'ল TrackBar.Valueএকটি পূর্ণসংখ্যা মান এবং কোনও পূর্বে ফলাফলের মাধ্যমে একটি ইন্টি বিভাজন করে কোনও প্রকারের ভেরিয়েবলকে আপনি এটি নির্ধারণ করেন না কেন। এই ক্ষেত্রে ইনট থেকে দশমিক বা ডাবল পর্যন্ত অন্তর্নিহিত কাস্ট রয়েছে - কারণ আপনি যখন doালাই করবেন তখন নির্ভুলতার কোনও ক্ষতি হয় না - তাই সংকলকটি অভিযোগ করে না, তবে আপনি যে মান পাবেন তা সর্বদা 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

ধরে নিই যে আপনি উইনফরম ব্যবহার করছেন, 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;


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.