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

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

Вот мой код:

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

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

Cannot implicitly convert type decimal to double.

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

Комментарии к вопросу (2)
Решение

Явное приведение к double в этом случае не нужно:

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

Достаточно идентифицировать константу как 5000.0 (или как 5000d):

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Комментарии (0)

Более общий ответ на общий вопрос "Decimal vs Double? ": Decimal для денежных вычислений, чтобы сохранить точность, Double для научных вычислений, на которые не влияют небольшие различия. Поскольку Double - это тип, который является родным для CPU (внутреннее представление хранится в base 2), вычисления, производимые с помощью Double, выполняются лучше, чем Decimal (который внутренне представлен в base 10).

Комментарии (0)

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

В C# преобразование из десятичной в дабл явный, как вы теряете точность. Например, 1.1 может'т быть точно выражено как двухместная, но может в виде десятичной дроби (см. фильм "1 и quot[числа с плавающей точкой - более неточным, чем ты думаешь]; ибо причина).

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

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

Что `(двойная) должны быть прямо указаны в C#, но можно подразумевается В. Б.'s больше 'прощать' сост.

Комментарии (0)

Почему вы деления на 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;
}
Комментарии (1)

У вас есть две проблемы. Во-первых, "непрозрачность" требует двойной, а не десятичные значения. Компилятор говорит вам, что пока существует преобразования между десятичной и двойная, это явное преобразование, что вам нужно указать для того, чтобы работать. Второй заключается в том, что ползунком.Значение-это целое число и деления int на результаты инт в инт не имеет значения, какой тип переменной присвоить его. В этом случае есть неявное преобразование из int в decimal или Double - потому что нет никакой потери точности, когда вы делаете бросок - поэтому компилятор не'т жаловаться, но значение, которое вы получаете всегда 0, по-видимому, с ползунком.Значение всегда меньше, чем 5000. Решение, чтобы изменить свой код, чтобы использовать двойные (родной тип для непрозрачности) и делать арифметику с плавающей точкой, явно делая постоянные двойные, последствия которого будут способствовать арифметика - или литьяползунком.Значение` в двойной, который будет делать то же самое - или оба. Ой, а вы не'т необходимость промежуточной переменной, если она используется в другом месте. Я думаю, компилятор все равно оптимизирует его,.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Комментарии (0)

На мой взгляд, желательно быть как можно более откровенными. Это добавляет ясности в код и СПИД ваших коллег-программистов, которые в конечном итоге могут прочитать.

В дополнение к (или вместо) добавить .0 в число, вы можете использовать десятичные.Метод 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);
Комментарии (0)

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

Комментарии (0)

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

Комментарии (0)

В непрозрачность свойство типа double:

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

или просто:

this.Opacity = trackBar1.Value / 5000.0;

или:

this.Opacity = trackBar1.Value / 5000d;

Обратите внимание, что я использую 5000.0 (или 5000d) в силу двойное деление, поскольку trackBar1 .Значение - это целое число и оно будет выполнять целочисленное деление и результат будет целым числом.

Комментарии (0)

Предполагая, что вы используете приложения WinForms, форма.Непрозрачность имеет тип double, так что вы должны использовать:

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

Если вам нужно значение в другом месте, это'ы проще написать:

this.Opacity = trackBar1.Value / 5000.0;

Почему контроль не'т работу, когда вы изменили свой код, чтобы просто быть двойным, потому что:

double trans = trackbar1.Value / 5000;

который интерпретировал 5000 как целое, и потому что trackbar1.Значение является целочисленным значением ваш "транс" всегда был ноль. Явно делая числовое значение с плавающей точкой путем добавления .0 компилятор теперь может интерпретировать это как двойное и выполнить правильный расчет.

Комментарии (0)

Самое лучшее решение-это:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Комментарии (0)

Так как "непрозрачность" имеет двойное значение, я бы просто использовать двойную с самого начала и не бросил вовсе, но будьте уверены, чтобы использовать двойной при делении, так что вы Дон'т потерять ни точности

Opacity = trackBar1.Value / 5000.0;
Комментарии (0)