2009-05-19 9 views

Respuesta

19

No, no es así. Sin embargo, su expresión casi con seguridad no hace lo que usted desea.

Las expresiones 1/12 y 3/12 se realizarán utilizando número entero aritmética.

es probable que desee:

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

o

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

Ambos obligará a la división que se realiza utilizando la aritmética de coma flotante.

El problema aquí es que si los dos operandos de un operador aritmético son enteros, entonces la operación se realiza utilizando la aritmética de enteros, incluso si es parte de una expresión más grande que es de tipo double. Aquí, su expresión es efectiva:

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

La suma y la resta está bien, porque los tipos de a y b obligarlos a llevar a cabo utilizando la aritmética de punto flotante - pero debido a la división "se une más estrechamente" que la suma y la resta (es decir, es como usar los corchetes anteriores) solo se consideran los operandos inmediatos.

¿Tiene sentido?

EDIT: Como es tan popular, que tiene sentido para incluir el comentario de devinb aquí también:

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

Es todo lo mismo que lo que se refiere al compilador - sólo tiene que decidir cuál es la más clara para que:

(double) 1 
1.0 
1d 
+0

¿no sería más apropiado usar (doble) 1/(doble) 12 + (doble) 3/(doble) 12? Me doy cuenta de que la operación aritmética promoverá el tipo, pero me parece más claro, al menos para mí, describir explícitamente los moldes para todo. –

+0

¿Por qué siempre es así si de repente hay una gran respuesta, es casi seguro que sea tuya? ;) – User

+0

@Mastermind: ¿has VISTO su representante? :-) –

2

No, no se necesita fundición.

0

no debería ser necesario, aunque es difícil saber a partir de la pregunta ¿dónde estaría el molde.

0

Al hacer matemática, C# devolverá el resultado como el tipo de argumento que tenga el tipo más grande.

Por lo que recuerdo, el orden es algo como esto (de mayor a menor):

  1. decimal
  2. doble
  3. flotador
  4. larga/Int64
  5. int/int32
  6. corto/int16
  7. byte

Por supuesto, esto omite las versiones sin firmar de cada uno de estos.

0

En general, no se necesita conversión, pero en su ejemplo, 1/12 y 3/12 son divisiones enteras, lo que da como resultado 0 para cada expresión. Tendría que convertir uno de los numeradores o denominador en double.

0

La conversión se usa para indicar cuando quiera cambiar un tipo de datos a otro tipo. Esto se debe a que cambiar el type generalmente implica una posible pérdida de datos.

p. Ej.

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; 

En ese ejemplo 'b' va a terminar con el valor de "8,00000 ..." Esto se debe a_int no contiene ninguna información decimal, y así B sólo tiene la información relacionada con el número entero a su disposición.

2

Hmm - La forma en que he hecho esto para la emisión división entera es hacer algo como:

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

Aparte de aquellos, sin embargo, no sería necesaria una fundición.

2

Por supuesto, hay una forma limpia de hacer esto sin calidad:

double result = a - b + 1.0/12 + 3.0/12; 
2

Eso realmente depende de lo que estás preguntando por fundición. Aquí hay dos 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 cualquier manera que no va a conseguir ninguna queja sobre la asignación del valor que resulte, pero en el primer caso la división al final se hace usando números enteros que se resuelven a 0.

Cuestiones relacionadas