Para retornar uma dupla, eu tenho que lançar para dobrar mesmo tipos são duplos em c #?

votos
7

Para retornar uma dupla, eu tenho que lançar para dobrar mesmo tipos são o dobro?

por exemplo

double a = 32.34;
double b = 234.24;

double result = a - b + 1/12 + 3/12;

Eu tenho que lançar (duplo)?

Publicado 19/05/2009 em 20:48
fonte usuário
Em outras línguas...                            


9 respostas

votos
19

Não, você não. No entanto, sua expressão quase certamente não faz o que você quer que ele.

As expressões 1/12 e 3/12 vai ser realizada utilizando inteiro aritmética.

Você provavelmente quer:

double result = a - b + 1/12d + 3/12d;

ou

double result = a - b + 1/(double) 12 + 3/(double) 12;

Ambas irão forçar a divisão a ser executada usando a aritmética de ponto flutuante.

O problema aqui é que se ambos os operandos de um operador aritmético são inteiros, então a operação é realizada utilizando aritmética inteira, mesmo que seja parte de uma expressão maior que é do tipodouble . Aqui, a sua expressão é efetivamente:

double result = a - b + (1 / 12) + (3 / 12);

A adição e subtração é bom, porque os tipos de ae bforçá-los a ser executada usando a aritmética de ponto flutuante - mas porque a divisão "se liga mais firmemente" de adição e subtração (ou seja, é como usar os suportes acima) apenas os operandos imediatos são considerados.

Isso faz sentido?

EDIT: Como é tão popular, não faz sentido incluir o comentário de devinb aqui também:

double result = a - b + 1.0/12.0 + 3.0/12.0;

É tudo a mesma coisa, tanto quanto o compilador está em causa - você só precisa decidir o que é mais clara para você:

(double) 1
1.0
1d
Respondeu 19/05/2009 em 20:51
fonte usuário

votos
2

Isso realmente depende do que você está perguntando sobre o elenco. Aqui estão dois casos diferentes:

double a = 32.34;
double b = 234.24;
double result1 = a - b + 1/12 + 3/12;
double result2 = a - b + (double)1/12 + (double)3/12;
Console.WriteLine(result1);  // Result: -201.9
Console.WriteLine(result2);  // Result: -201.566666666667

De qualquer forma, você não vai conseguir quaisquer queixas sobre a atribuição do valor de resultado, mas no primeiro caso, a divisão no final é feito usando números inteiros que resolve a 0.

Respondeu 19/05/2009 em 21:00
fonte usuário

votos
2

Claro, há uma maneira limpa para fazer isso sem seleção de elenco:

double result = a - b + 1.0/12 + 3.0/12;
Respondeu 19/05/2009 em 20:56
fonte usuário

votos
2

Hmm - A maneira que eu fiz isso para a questão divisão inteira é fazer algo como:

double result = a - b + 1/12.0 + 3/12.0

Afora esses, porém, seria necessário nenhum casting.

Respondeu 19/05/2009 em 20:56
fonte usuário

votos
2

Não, não é necessário nenhum casting.

Respondeu 19/05/2009 em 20:49
fonte usuário

votos
0

Fundição é usado para indicar sempre que você quiser mudar um tipo de dados para outro tipo. Isso ocorre porque mudar o typegeralmente envolve uma possível perda de dados.

por exemplo

double a = 8.49374;

//casting is needed because the datatypes are different.
// a_int will end up with the value is 8, because the precision is lost.
int a_int = (int) a; 

double b = (double) a_int; 

Nesse exemplo, 'b' vai acabar com o valor de "8,00 mil ..." isso é porque a_int não contém qualquer informação decimal, e assim b só tem a informação relacionada inteiro à sua disposição.

Respondeu 19/05/2009 em 20:54
fonte usuário

votos
0

Em geral não é necessário nenhum casting, mas no seu exemplo, o 1/12e 3/12são divisão inteira, resultando em 0 para cada expressão. Você precisaria lançar um do numerador ou denominador double.

Respondeu 19/05/2009 em 20:51
fonte usuário

votos
0

Ao fazer matemática, C # retornará o resultado como o tipo de qualquer argumento tem o tipo maior.

Pelo que me lembro, a ordem é algo como isto (do maior para o menor):

  1. decimal
  2. Duplo
  3. flutuador
  4. Longo / int64
  5. int / int32
  6. curto / int16
  7. byte

Claro, isso está ignorando as versões não assinados de cada uma delas.

Respondeu 19/05/2009 em 20:51
fonte usuário

votos
0

Você não precisa, embora seja difícil dizer de sua pergunta onde o elenco seria.

Respondeu 19/05/2009 em 20:51
fonte usuário

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