c# - للصف - مشاريع الفيجوال بيسك جاهزة




تحويل عشري إلى مزدوج (9)

إجابة أكثر عمومية عن السؤال العام "عشري مقابل مزدوج؟": عشري للحسابات النقدية للحفاظ على الدقة ، مضاعفة للحسابات العلمية التي لا تتأثر الاختلافات الصغيرة. بما أن Double عبارة عن نوع موطن لوحدة المعالجة المركزية (يتم تخزين التمثيل الداخلي في القاعدة 2 ) ، فإن الحسابات التي يتم إجراؤها باستخدام Double تكون أفضل ثم Decimal (والتي يتم تمثيلها في الأساس 10 داخليًا).

أريد استخدام شريط المسار لتغيير عتامة النموذج.

هذا هو الكود الخاص بي:

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

عندما أقوم بإنشاء التطبيق ، فإنه يعطي الخطأ التالي:

لا يمكن ضمنيًا تحويل النوع decimal إلى double

حاولت استخدام trans و double لكن بعد ذلك لا يعمل التحكم. هذا الرمز يعمل بشكل جيد في مشروع VB.NET الماضي.


الحل الأفضل هو:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

على افتراض أنك تستخدم WinForms ، 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 ، يستطيع المترجم الآن تفسيرها على أنها مضاعفة وتنفيذ الحساب المناسب.


في رأيي ، من المستحسن أن تكون صريحًا قدر الإمكان. هذا يضيف الوضوح إلى الكود ويساعد زملائك المبرمجين الذين قد يقرأونه في النهاية.

بالإضافة إلى (أو بدلاً من) إلحاق .0 بالرقم ، يمكنك استخدام decimal.ToDouble() . 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);

لقد نجحت التعليمة البرمجية الخاصة بك في VB.NET لأنها تعمل ضمنيًا على أي قوالب ، بينما يحتوي C # على ضمني وصريح.

في C # ، يكون التحويل من عشري إلى مزدوج صريحًا حيث تفقد الدقة. على سبيل المثال ، لا يمكن التعبير عن 1.1 كدقة مزدوجة ، ولكن يمكن اعتباره كعدد عشري (راجع " أرقام الفاصلة العائمة - غير دقيقة أكثر مما تعتقد " لسبب ذلك).

في VB ، تمت إضافة التحويل لك من قبل المترجم:

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

يجب توضيح ذلك (double) بشكل صريح في C # ، ولكن يمكن تضمينه بواسطة مترجم VB الأكثر تسامحا.


لماذا تقسم 5000؟ فقط قم بتعيين القيم الدنيا والقصوى لـ TrackBar بين 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;
}

نظرًا لأن Opacity عبارة عن قيمة مزدوجة ، فإني فقط استخدم double من البداية وليس على الإطلاق ، ولكن تأكد من استخدام double عند القسمة حتى لا تفقد أي دقة

Opacity = trackBar1.Value / 5000.0;

يبدو هذا this.Opacity تعد this.Opacity مضاعفة ، ولا يحب المترجم محاولة وضع علامة عشرية عليها.


this.Opacity = trackBar1.Value / 5000d;






decimal