Дополнительно
Преобразование десятичной дроби в двойную
Я хочу использовать track-bar для изменения непрозрачности формы.
Вот мой код:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
Когда я собираю приложение, оно выдает следующую ошибку:
Cannot implicitly convert type
decimal
todouble
.
Я пробовал использовать trans
и double
, но тогда элемент управления не работает. Этот код прекрасно работал в прошлом проекте VB.NET.
640
13
Явное приведение к
double
в этом случае не нужно:Достаточно идентифицировать константу как
5000.0
(или как5000d
):Более общий ответ на общий вопрос "Decimal vs Double? ": Decimal для денежных вычислений, чтобы сохранить точность, Double для научных вычислений, на которые не влияют небольшие различия. Поскольку Double - это тип, который является родным для CPU (внутреннее представление хранится в base 2), вычисления, производимые с помощью Double, выполняются лучше, чем Decimal (который внутренне представлен в base 10).
Ваш код работал нормально в VB.NET потому что это неявно делает любой скинется, а в C# есть как косвенные, так и явными.
В C# преобразование из десятичной в дабл явный, как вы теряете точность. Например, 1.1 может'т быть точно выражено как двухместная, но может в виде десятичной дроби (см. фильм "1 и quot[числа с плавающей точкой - более неточным, чем ты думаешь]; ибо причина).
В VB это преобразование было добавлено для вас компилятором:
Что `(двойная) должны быть прямо указаны в C#, но можно подразумевается В. Б.'s больше 'прощать' сост.
Почему вы деления на 5000? Просто установите ползунком'с минимальным и максимальным значениями между 0 и 100, а затем разделить на 100 непрозрачности в процентах. Минимум 20 пример ниже позволяет форме становится полностью невидимым:
У вас есть две проблемы. Во-первых, "непрозрачность" требует двойной, а не десятичные значения. Компилятор говорит вам, что пока существует преобразования между десятичной и двойная, это явное преобразование, что вам нужно указать для того, чтобы работать. Второй заключается в том, что
ползунком.Значение-это целое число и деления int на результаты инт в инт не имеет значения, какой тип переменной присвоить его. В этом случае есть неявное преобразование из int в decimal или Double - потому что нет никакой потери точности, когда вы делаете бросок - поэтому компилятор не'т жаловаться, но значение, которое вы получаете всегда 0, по-видимому, с ползунком.Значение всегда меньше, чем 5000. Решение, чтобы изменить свой код, чтобы использовать двойные (родной тип для непрозрачности) и делать арифметику с плавающей точкой, явно делая постоянные двойные, последствия которого будут способствовать арифметика - или литья
ползунком.Значение` в двойной, который будет делать то же самое - или оба. Ой, а вы не'т необходимость промежуточной переменной, если она используется в другом месте. Я думаю, компилятор все равно оптимизирует его,.На мой взгляд, желательно быть как можно более откровенными. Это добавляет ясности в код и СПИД ваших коллег-программистов, которые в конечном итоге могут прочитать.
В дополнение к (или вместо) добавить
.0
в число, вы можете использовать десятичные.Метод todouble()`.Вот некоторые примеры:
Похоже, что
this.Opacity
является двойным значением, и компилятору не нравится, что вы пытаетесь запихнуть в него десятичное значение.Вы должны использовать
5000.0
вместо5000
.В непрозрачность свойство типа double:
или просто:
или:
Обратите внимание, что я использую
5000.0
(или5000d
) в силу двойное деление, поскольку trackBar1.Значение
- это целое число и оно будет выполнять целочисленное деление и результат будет целым числом.Предполагая, что вы используете приложения WinForms,
форма.Непрозрачность
имеет типdouble
, так что вы должны использовать:Если вам нужно значение в другом месте, это'ы проще написать:
Почему контроль не'т работу, когда вы изменили свой код, чтобы просто быть двойным, потому что:
который интерпретировал
5000
как целое, и потому что trackbar1.Значение является целочисленным значением ваш "транс" всегда был ноль. Явно делая числовое значение с плавающей точкой путем добавления.0
компилятор теперь может интерпретировать это как двойное и выполнить правильный расчет.Самое лучшее решение-это:
Так как "непрозрачность" имеет двойное значение, я бы просто использовать двойную с самого начала и не бросил вовсе, но будьте уверены, чтобы использовать двойной при делении, так что вы Дон'т потерять ни точности