Преобразовать десятичную в двойную?

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

Это мой код:

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

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

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

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

626
задан 32 revs, 26 users 13% 19 July 2019 в 01:39
поделиться

8 ответов

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

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

Идентификация константы как 5000.0 (или как 5000d) достаточна:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
424
ответ дан user4020527 19 July 2019 в 01:39
поделиться

Необходимо использовать 5000.0 вместо 5000.

47
ответ дан Paul Fleming 19 July 2019 в 01:39
поделиться

По-моему, желательно быть максимально явным. Это добавляет ясность к коду и помогает Вашим коллегам - программистам, которые могут в конечном счете считать его.

В дополнение к (или вместо) добавление .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
ответ дан Paul Fleming 19 July 2019 в 01:39
поделиться

Почему Вы делитесь на 5 000? Просто установите Минимальные и Максимальные значения 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;
}
77
ответ дан Peter Mortensen 19 July 2019 в 01:39
поделиться

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

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

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

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

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

80
ответ дан Paul Fleming 19 July 2019 в 01:39
поделиться

Более универсальный ответ для универсального вопроса "Десятичное число по сравнению с Дважды?": Десятичное число для денежных вычислений для сохранения точности, Двойной для научных вычислений, которые не становятся затронутыми небольшими различиями. С тех пор Дважды тип, который является собственным к ЦП (внутреннее представление хранится в основа 2 ), вычисления, сделанные с Двойным, выполняют лучше тогда Десятичное число (который представлен в основа 10 внутренне).

121
ответ дан Sid M 19 July 2019 в 01:39
поделиться

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

55
ответ дан Paul Fleming 19 July 2019 в 01:39
поделиться

У Вас есть две проблемы. Во-первых, Opacity требует двойного, не десятичного значения. Компилятор говорит Вам что, в то время как существует преобразование между десятичным числом и дважды, это - явное преобразование, которое необходимо определить для него для работы. Второе - то, что TrackBar.Value целочисленное значение, и деление интервала интервалом приводит к интервалу, какому типу переменной Вы присваиваете его. В этом случае существует неявный бросок от интервала до десятичного числа или дважды - потому что нет никакой потери точности, когда Вы делаете бросок - таким образом, компилятор не жалуется, но значение, которое Вы получаете, всегда 0, по-видимому, так как trackBar.Value всегда меньше чем 5 000. Решение состоит в том, чтобы изменить Ваш код, чтобы использовать дважды (собственный тип для Непрозрачности) и сделать арифметику с плавающей точкой путем явного создания константы двойным - который будет иметь эффект продвижения арифметики - или кастинг trackBar.Value для удвоения, который сделает то же самое - или оба. О, и Вам не нужна промежуточная переменная, если она не использовала в другом месте. Мое предположение является компилятором, оптимизировал бы его далеко, так или иначе.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
60
ответ дан Dez 19 July 2019 в 11:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: