Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Преобразовать Decimal в Double?
Я хочу использовать трек-бар, чтобы изменить непрозрачность формы.
Это мой код:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
Когда я строю приложение, оно выдает следующую ошибку:
Невозможно неявно преобразовать тип
'decimal'в'double'.
Я пробовал использовать trans и double , но тогда контроль не работает. Этот код прекрасно работал в прошлом проекте VB.NET.
Более общий ответ на общий вопрос "Decimal vs Double?": Decimal для денежных расчетов, чтобы сохранить точность, дважды для научных расчетов, на которые не влияют небольшие различия. Поскольку Double-это тип, который является родным для CPU (внутреннее представление хранится в базе 2 ), вычисления, выполненные с помощью Double, выполняют лучше, чем Decimal (который представлен в базе 10 внутренне).
Ваш код отлично работал в VB.NET, потому что он неявно выполняет любые приведения, в то время как C# имеет как неявные, так и явные приведения.
В C# преобразование из decimal в double является явным, поскольку вы теряете точность. Например, 1.1 нельзя точно выразить как двойник, но можно как decimal (см. "числа с плавающей точкой - более неточные, чем вы думаете" по этой причине).
В VB преобразование было добавлено для вас компилятором:
decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;
Это (double) должно быть явно указано в C#,,но может быть подразумеваемо более 'forgiving' компилятором VB.
Почему вы делите на 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;
}
У вас есть две проблемы. Во-первых, Opacity требует двойного, а не decimal значения. Компилятор говорит вам, что, хотя существует преобразование между decimal и double, это явное преобразование, которое вам нужно указать, чтобы оно работало. Во-вторых, TrackBar.Value -это целочисленное значение, и деление int на int приводит к int независимо от того, какому типу переменной вы его назначаете. В этом случае существует неявное приведение от int к decimal или double-потому что при приведении не происходит потери точности-поэтому компилятор не жалуется, но значение, которое вы получаете, всегда равно 0, предположительно, так как trackBar.Value всегда меньше 5000. Решение состоит в том, чтобы изменить свой код на использование double (собственный тип для непрозрачности) и сделать арифметику с плавающей запятой, явно сделав константу double - что будет иметь эффект продвижения арифметики - или приведение trackBar.Value к double, что будет делать то же самое - или то и другое. О, и вам не нужна промежуточная переменная, если она не используется в другом месте. Я предполагаю, что компилятор все равно оптимизирует его.
trackBar.Opacity = (double)trackBar.Value / 5000.0;
На мой взгляд, желательно быть максимально откровенным. Это добавляет ясности коду и помогает вашим коллегам-программистам, которые в конечном итоге могут прочитать его.
В дополнение к (или вместо) добавления .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);
Свойство 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 -это целое число, и оно будет выполнять целочисленное деление, и результат будет целым числом.
Предполагая, что вы используете 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 , компилятор теперь может интерпретировать его как двойник и выполнить правильное вычисление.