Embora a aplicação de opacidade a um formulário, devemos usar um decimal ou um valor duplo?

votos
557

Eu quero usar uma faixa-bar para alterar a opacidade de um formulário.

Este é meu código:

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

Quando eu criar o aplicativo, ele dá o seguinte erro:

Não é possível converter implicitamente o tipo 'decimal'de 'double'.

Eu tentei usar transe double, mas, em seguida, o controle não funciona. Este código funcionou bem em um projeto VB.NET passado.

Publicado 31/07/2008 em 22:42
fonte usuário
Em outras línguas...                            


13 respostas

votos
395

Uma conversão explícita para o dobro como isso não é necessário:

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

Identificando a constante como 5000.0(ou como 5000d) é suficiente:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Respondeu 31/07/2008 em 23:17
fonte usuário

votos
114

Uma resposta mais genérica para a pergunta genérica "Decimal vs Duplo?": Decimal para cálculos monetários para preservar a precisão, duplo para cálculos científicos que não são afetados por pequenas diferenças. Desde dupla é de um tipo que é nativa para a CPU (representação interna é armazenado na base 2 ), os cálculos feitos com um melhor desempenho Duplo então Decimal (que está representado na base 10 internamente).

Respondeu 01/08/2008 em 15:23
fonte usuário

votos
75

Seu código funcionou bem no VB.NET porque ele faz implicitamente qualquer elencos, enquanto que C # tem tanto aqueles implícitos e explícitos.

Em C # a conversão de decimal para dobrar é explícito como você perde precisão. Por exemplo 1.1 não pode ser expressa com precisão como uma dupla, mas pode como um decimal (ver " números de ponto flutuante - mais imprecisas do que você pensa " para a razão pela qual).

Em VB a conversão foi adicionado para você pelo compilador:

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

Isso (double)tem que ser explicitamente declarado em C #, mas pode ser implicado em mais de compilador 'perdoar' do VB.

Respondeu 10/08/2008 em 18:54
fonte usuário

votos
74

Por que você está dividindo por 5000? Basta definir mínima do TrackBar e valores máximos entre 0 e 100 e depois dividir o valor por 100, o percentual de opacidade. O exemplo 20 mínimo abaixo impede a forma de se tornar completamente invisível:

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;
}
Respondeu 21/09/2008 em 04:51
fonte usuário

votos
57

Você tem dois problemas. Em primeiro lugar, Opacityrequer um, não um valor decimal de casal. O compilador está lhe dizendo que, embora exista uma conversão entre decimal e double, é uma conversão explícita de que você precisa especificar em ordem para que ele funcione. A segunda é que TrackBar.Valueé um valor inteiro e dividindo um int por um int resulta em um int não importa que tipo de variável que você atribuí-la a. Neste caso, há uma conversão implícita de int para decimal ou duplo - porque não há nenhuma perda de precisão quando você faz o elenco - para que o compilador não reclama, mas o valor que você recebe é sempre 0, presumivelmente, uma veztrackBar.Valueé sempre menor do que 5000. A solução é alterar o código para usar o dobro (o tipo nativo de opacidade) e não aritmética de ponto flutuante, fazendo explicitamente a constante uma dupla - que terá o efeito de promover a aritmética - ou fundição trackBar.Valuepara dobrar , que vai fazer a mesma coisa - ou ambos. Ah, e você não precisa a variável intermediária, a menos que usado em outro lugar. Meu palpite é que o compilador otimizar-lo, de qualquer maneira.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Respondeu 27/02/2009 em 12:45
fonte usuário

votos
55

Na minha opinião, é desejável para ser mais explícito possível. Isso adiciona clareza para o código e ajuda seus companheiros de programadores que podem, eventualmente, lê-lo.

Além de (ou em vez de) acrescentando um .0ao número, você pode usar decimal.ToDouble().

aqui estão alguns exemplos:

// Example 1
double transperancy = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transperancy);

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Respondeu 05/08/2008 em 21:18
fonte usuário

votos
53

Parece que this.Opacityé um valor duplo, eo compilador não gosta de você tentar empinar um valor decimal para ele.

Respondeu 01/08/2008 em 14:53
fonte usuário

votos
45

Você deve usar 5000.0em vez de 5000.

Respondeu 20/11/2008 em 15:36
fonte usuário

votos
44

A opacidade propriedade é do tipo double:

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

ou simplesmente:

this.Opacity = trackBar1.Value / 5000.0;

ou:

this.Opacity = trackBar1.Value / 5000d;

Observe que estou usando 5000.0(ou 5000d) para forçar uma divisão dupla, porque trackBar1.Valueé um inteiro e seria realizar uma divisão inteira e o resultado seria um número inteiro.

Respondeu 31/08/2011 em 20:08
fonte usuário

votos
42

Supondo que você estiver usando WinForms, Form.Opacityé do tipo double, então você deve usar:

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

A menos que você precisa o valor em outros lugares, é mais simples de escrever:

this.Opacity = trackBar1.Value / 5000.0;

A razão que o controle não funciona quando você alterou o código para ser simplesmente um duplo foi porque você teve:

double trans = trackbar1.Value / 5000;

que interpretou a 5000como um inteiro, para que o seu transvalor foi sempre zero. Ao fazer explicitamente a um valor numérico de ponto flutuante, adicionando o .0compilador agora pode interpretá-lo como um casal e realizar o cálculo adequado.

Respondeu 31/08/2011 em 20:09
fonte usuário

votos
38

A melhor solução é:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Respondeu 06/03/2012 em 09:07
fonte usuário

votos
37

Desde Opacityé um valor duplo, gostaria apenas de usar um duplo desde o início e não lançados em tudo, mas não se esqueça de usar um duplo quando dividindo assim você não perde nenhuma precisão

Opacity = trackBar1.Value / 5000.0;
Respondeu 13/05/2012 em 03:10
fonte usuário

votos
31
this.Opacity = trackBar1.Value / 5000d;
Respondeu 11/04/2013 em 16:08
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more