Ondalık ədədi ikiyə bölüşdürün?

Şəksiz şəffaflığı dəyişdirmək üçün yoldan istifadə etmək istərdim.

Bu mənim kodumdur:

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

Bir tətbiq yaratdığımda aşağıdakı səhvləri verir:

Tipik 'decimal' tipini 'double' olaraq bağlaya bilmir.

Mən transdouble istifadə etməyə çalışdım, amma sonra nəzarət işləmir. Bu kod ötən VB.NET layihəsində gözəl işləmişdir.

594
01 авг. Yumurta McLaren tərəfindən təyin 01 aug. 2008-08-01 00:42 '08 at 0:42 2008-08-01 00:42
@ 14 cavab

İki qat artırmaq üçün aydın döküm lazım deyil:

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

5000.0 (və ya 5000d kimi) kimi sabit müəyyən etmək kifayətdir:

 double trans = trackBar1.Value / 5000.0; double trans = trackBar1.Value / 5000d; 
412
01 авг. Cavab Kevin Dente 01 aug tərəfindən verilir . 2008-08-01 01:17 '08 at 1:17 2008-08-01 01:17

"Ondalık və ikiqat" ümumi sualına daha ümumi bir cavab: Doğruluğu təmin etmək üçün pul hesablamaları üçün ondalık , kiçik fərqlərdən təsirlənməyən elmi hesablamalar üçün ikili . Cüt cüt CPU-ya doğma bir növüdür (daxili nümayəndəlik 2-ci bazada saxlanılır), Double istifadə edilən hesablamalar Ondalıkdan daha yaxşıdır (içərisində 10 əsasda təmsil olunur).

border=0
120
01 авг. cavab verildi husayint 01 Avqu 2008-08-01 17:23 '08 at 17:23 2008-08-01 17:23

Sizin kodunuz VB.NET-də mükəmməl şəkildə işləmişdir, çünki hər hansı bir döyməni yerinə yetirir, çünki C # həm örtük, həm də açıqdır.

C # -də ikili dönüşüm üçün decimal ədəd dəqiqdir, çünki həssaslıq azalır. Məsələn, 1.1 dəqiq olaraq dəqiq ifadə edilə bilməz, lakin onlu ola bilər (bax: " Üzmə nöqtəsi nömrələri düşündüyünüzdən daha çox səhvdir ").

VB-də, tərtibat sizin kompilyatorunuz tərəfindən əlavə edildi:

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

Bu (double) C #-də açıq şəkildə ifadə edilməlidir, lakin VB tərtibçiləri tərəfindən daha bağışlayıcı ola bilər.

78
10 авг. Cavit 10 Avqustda verilən cavab 2008-08-10 20:54 '08 at 8:54 pm 2008-08-10 20:54

Niyə 5,000-ə bölünürsən? TrackBar-ın minimum və maksimum dəyərlərini 0-dan 100-ə qədər təyin edin və 100-dən dəyərini qeyri-şəffaflıq ilə bölün. Aşağıdakı misal ən azı 20 tam olaraq görünməyinizə imkan vermir:

 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; } 
75
21 сент. Gordon Bell tərəfindən verilmiş cavab 21 Sep. 2008-09-21 06:51 '08 saat 06:51 'da 2008-09-21 06:51

İki probleminiz var. Birincisi, Opacity ondalık dəyərlər deyil, ikiqat tələb edir. Derivə, onlu və ikili arasında bir dönüşüm olmasına baxmayaraq, bu, işləmək üçün müəyyən etmək üçün lazım olan dəqiq bir dönüşümdür. İkincisi, TrackBar.Value bir tam dəyərdir və bir int int tərəfindən bölüşdürülür int bir növ dəyişən dəyişən növü nə olursa olsun. Bu halda, int-dən decimal və ya ikili bir örtük çevrilmə baş verir - çünki konvensiyanı yerinə yetirərkən dəqiqlik itkisi yoxdur - bu səbəbdən kompilyator şikayət etməyəcək, lakin əldə etdiyiniz dəyəri hər zaman 0, ehtimal ki, trackBar.Value ilə başlayan 5000-dən azdır. kodunuzu dəyişdirin, ikincisi (Opacity üçün öz növündən istifadə etmək üçün) dəyişdirin və açıq-aydın aritmetik və ya trackBar.Value təsirini artıracaq ikiqat sabit etmək, floating-point arithmetic yerinə eyni mənim - ya da hər ikisi. Oh, və başqa yerdə istifadə edilmirsə, siz aralıq dəyişənə ehtiyacınız yoxdur. Hesab edirəm ki, kompilyator onu hər halda optimallaşdırır.

 trackBar.Opacity = (double)trackBar.Value / 5000.0; 
58
27 февр. Cavab 27 fevralda tvanfosson tərəfindən verilir . 2009-02-27 14:45 '09 14:45 'da 2009-02-27 14:45

Mənim fikrimcə, mümkün qədər aydın olmağı arzulayıram. Bu, kodun aydınlığını artırır və nəticədə onu oxuya biləcək fellow proqramçılara kömək edir.

Sayı əlavə etmək (və ya əvəzinə) əlavə etmək üçün decimal.ToDouble() istifadə edə bilərsiniz.

Burada bəzi nümunələr var:

 // Example 1 double transperancy = trackBar1.Value/5000; this.Opacity = decimal.ToDouble(transperancy); // Example 2 - with inline temp this.Opacity = decimal.ToDouble(trackBar1.Value/5000); 
56
05 авг. Cavab verilir 05 avqust . 2008-08-05 23:18 '08 at 11:18 pm 2008-08-05 23:18

Göründüyü kimi, this.Opacity ikiqat dəyərdir və ona bir decimal dəyər qoymağa çalışdığınız zaman kompilyator onu sevmir.

55
01 авг. cavab Ryan Fox 01 aug tərəfindən verilir . 2008-08-01 16:53 '08 at 4:53 pm 2008-08-01 16:53

5000 əvəzinə 5000.0 istifadə etməlisiniz.

46
20 нояб. Cavab 20 noyabr tarixində Dinah verilir. 2008-11-20 17:36 '08 at 17:36 2008-11-20 17:36

Şəffaflıq mülkiyyəti ikiqat tiplidir:

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

və ya sadəcə:

 this.Opacity = trackBar1.Value / 5000.0; 

və ya

 this.Opacity = trackBar1.Value / 5000d; 

trackBar1.Value bir tamsayıdır və tamsayı bölməsini yerinə yetirəcək və nəticə bir tamsayı olacaq, çünki məcburi ikili bölmə üçün 5000.0 (və ya 5000d ) istifadə edin.

45
31 авг. Cavab Darin Dimitrov tərəfindən verilir 31 av. 2011-08-31 22:08 '11 at 10:08 pm 2011-08-31 22:08

WinForms istifadə Form.Opacity , Form.Opacity double Form.Opacity , belə ki, istifadə etməlisiniz:

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

Əgər başqa yerə dəyər lazım deyilsə, yazmaq daha asandır:

 this.Opacity = trackBar1.Value / 5000.0; 

Kodunuzu boşluğa dəyişdiyiniz zaman nəzarəti işləməməsinin səbəbi:

 double trans = trackbar1.Value / 5000; 

5000 tamsayı və buna görə də trackbar1.Value həm də bütün trans dəyərləriniz həmişə sıfır olaraq şərh olunur. Çıxarılan nöqtə sayısal dəyərini .0 tərtib edərək, əlavə olaraq .0 kompilyatoru onu cüt nömrə olaraq şərh edə bilər və düzgün hesablamanı yerinə yetirə bilər.

43
31 авг. ChrisF 31 aug tərəfindən verilmiş cavab 2011-08-31 22:09 '11 at 22:09 2011-08-31 22:09

Ən yaxşı həll:

 this.Opacity = decimal.ToDouble(trackBar1.Value/5000); 
39
06 марта '12 в 11:07 2012-03-06 11:07 Cavab Danny Fox tərəfindən 06 Mart '06 saat 11:07 'də verildi. 2012-03-06 11:07

Opacity ikiqat dəyər olduğundan, mən əvvəlcə başdan iki dəfə istifadə edirəm və heç vaxt istifadə etməyəcəyəm, amma bölüşdürdükdə ikiqat istifadə etməliyəm ki, dəqiqliyi itirməyin

 Opacity = trackBar1.Value / 5000.0; 
38
13 мая '12 в 5:10 2012-05-13 05:10 Cavab Darryl tərəfindən 13 May 'da 5:10' də verildi 2012-05-13 05:10
 this.Opacity = trackBar1.Value / 5000d; 
33
11 апр. cavab eaponz 11 apr. 2013-04-11 18:08 '13 at 18:08 2013-04-11 18:08

Kodu olmayan bir tam ədəd, bir növü çevrilmə və ya tip spesifikasiyası olmadığı təqdirdə, bir int növü olaraq qəbul edilir.

Beləliklə 5000 əvəzinə 5000.0 istifadə edin

0
17 янв. Cavab 17 yanvarda Edwin Lee tərəfindən verilir . 2019-01-17 16:39 '19 at 4:39 pm 2019-01-17 16:39