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

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

Это мой код:

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

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

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

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

594
01 авг. '08 в 0:42
источник поделиться
14 ответов

Явное приведение к удвоению, как это, необязательно:

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

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

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
412
01 авг. '08 в 1:17
источник

Связанные вопросы


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

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

120
01 авг. '08 в 17:23
источник

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

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

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

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

То, что (double) должно быть явно указано в С#, но может быть подразумевается компилятором VB более "прощающим".

78
10 авг. '08 в 20:54
источник

Почему вы делите на 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;
}
75
21 сент. '08 в 6:51
источник

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

trackBar.Opacity = (double)trackBar.Value / 5000.0;
58
27 февр. '09 в 14:45
источник

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

Помимо (или вместо) добавления .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);
56
05 авг. '08 в 23:18
источник

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

55
01 авг. '08 в 16:53
источник

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

46
20 нояб. '08 в 17:36
источник

Свойство Opacity имеет двойной тип:

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

45
31 авг. '11 в 22:08
источник

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

43
31 авг. '11 в 22:09
источник

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

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
39
06 марта '12 в 11:07
источник

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

Opacity = trackBar1.Value / 5000.0;
38
13 мая '12 в 5:10
источник
this.Opacity = trackBar1.Value / 5000d;
33
11 апр. '13 в 18:08
источник

non-.0ed целое число обрабатывается как тип int, если только код не имеет приведение типа или спецификацию типа.

Так что используйте 5000.0 вместо 5000

0
17 янв. '19 в 16:39
источник

Посмотрите другие вопросы по меткам или Задайте вопрос