Преобразование -десятичного Удвоить?

голоса
573

Я хочу использовать трек-бар изменить Непрозрачность формы.

Это мой код:

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

Когда я строю приложение, оно дает следующее сообщение об ошибке:

Не может неявно преобразовать тип 'decimal'в 'double'.

Я попытался с помощью transи , doubleно затем этот элемент управления не работает. Этот код работает отлично в прошлом проекте VB.NET.

Задан 31/07/2008 в 21:42
источник пользователем
На других языках...                            


13 ответов

голоса
395

Явное приведение в два раза, как это не является необходимым:

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

Определение константы , как 5000.0(или 5000d) достаточно:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Ответил 31/07/2008 d 23:17
источник пользователем

голоса
114

Более общий ответ на общий вопрос «Decimal против Double?»: Decimal для денежных расчетов для сохранения точности, Double для научных расчетов , которые не затронуты небольшими различиями. Так как двойной тип , который является родным для CPU (внутреннее представление хранится в базе 2 ), расчеты с двойными выполнять лучше , чем Decimal (который представлен в базе 10 внутренне).

Ответил 01/08/2008 d 15:23
источник пользователем

голоса
75

Ваш код работает отлично в VB.NET, поскольку он неявно делает любые броски, в то время как C # имеет как явные и неявные из них.

В C # преобразование из десятичной системы счисления в удвоении явно , как вы теряете точность. Например 1.1 не может быть точно выражено в виде двойной, но может как десятичную (смотри « чисел с плавающей точкой - более неточным , чем вы думаете » по той причине , почему).

В VB преобразование был добавлен для вас компилятором:

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

Это (double)должно быть явно указано в C #, но может быть подразумевал более «прощающий» компилятор VB в.

Ответил 10/08/2008 d 18:54
источник пользователем

голоса
74

Почему вы разделив на 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;
}
Ответил 21/09/2008 d 04:51
источник пользователем

голоса
57

У вас есть две проблемы. Во- первых, Opacityтребует двойного, а не десятичное значение. Компилятор говорит вам , что в то время как есть преобразование между десятичной и дважды, это явное преобразование , что вам необходимо указать для того , чтобы его работать. Во - вторых, TrackBar.Valueэто целое число , а не делением Int ПРОИЗВОДИМОГО INT приводит к междунар независимо от того , какой тип переменной , которую можно назначить. В этом случае существует неявное приведение от Int в десятичном или двойном - потому что нет никакой потери точности , когда вы делаете бросок - так что компилятор не жалуется, но значение , которое вы получите всегда 0, по- видимому, такtrackBar.Valueвсегда меньше , чем 5000. Решение изменить код , чтобы использовать двойные (родной тип для непрозрачности) и не арифметику с плавающей точкой, явно делая постоянный двойной - который будет иметь эффект поощрения арифметики - или литья trackBar.Valueв два раза , который будет делать то же самое - или оба. О, и вам не нужно промежуточной переменной , если она не используется в другом месте. Я думаю, что компилятор будет оптимизировать его прочь, в любом случае.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Ответил 27/02/2009 d 12:45
источник пользователем

голоса
55

На мой взгляд, желательно, чтобы быть столь же явно, как это возможно. Это вносит ясность кода и помогает своим коллегам программистов, которые могут в конечном итоге прочитать его.

В дополнение к (или вместо) используя символ .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);
Ответил 05/08/2008 d 21:18
источник пользователем

голоса
53

Похоже , this.Opacityэто двойное значение, и компилятор не любит вы пытаетесь втиснуть десятичное значение в него.

Ответил 01/08/2008 d 14:53
источник пользователем

голоса
45

Вы должны использовать 5000.0вместо 5000.

Ответил 20/11/2008 d 15:36
источник пользователем

голоса
44

Непрозрачность свойство двойного типа:

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является целым числом , и он будет выполнять целочисленное деление и результат будет целым числом.

Ответил 31/08/2011 d 20:08
источник пользователем

голоса
42

Предполагая , что вы используете 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как целое, так что ваша transвеличина всегда равна нулю. Явно делая числовое значение с плавающей запятой, добавив .0компилятор теперь может интерпретировать это как двойные и выполнить правильный расчет.

Ответил 31/08/2011 d 20:09
источник пользователем

голоса
38

Лучшее решение:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Ответил 06/03/2012 d 09:07
источник пользователем

голоса
37

Так как Opacityэто двойное значение, я бы просто использовать двойной с самого начала и не бросить совсем, но обязательно использовать двойной при разделении , так что вы не потеряете какие - либо точности

Opacity = trackBar1.Value / 5000.0;
Ответил 13/05/2012 d 03:10
источник пользователем

голоса
31
this.Opacity = trackBar1.Value / 5000d;
Ответил 11/04/2013 d 16:08
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more