Pregunta

I codificado algunas cosas cálculo (he copiado a continuación un ejemplo muy simplifed de lo que hice) como CASE2 y obtuvo malos resultados. Refactorizado el código como CASE1 y funcionaba bien. Sé que hay una conversión implícita en el caso 2, pero no está seguro de la razón por completo. Cualquiera me podría explicar Cómo exactamente pasando abajo?

  //CASE 1, result 5.5
    double auxMedia = (5 + 6);
    auxMedia = auxMedia / 2;

    //CASE 2, result 5.0
    double auxMedia1 = (5 + 6) / 2;

    //CASE 3, result 5.5
    double auxMedia3 = (5.0 + 6.0) / 2.0;

    //CASE 4, result 5.5
    double auxMedia4 = (5 + 6) / 2.0;

Mi suposición es que / 2 en CASE2 está lanzando (5 + 6) para int y causando ronda de división a 5, a continuación fundido de nuevo para doblar y convertido a 5,0.

case3 y CASO 4 también corrige el problema.

¿Fue útil?

Solución

  1. 5 + 6 es número entero 11; que luego echado al doble (en la asignación) y dividir por dos; 5.5
  2. 5 + 6 es número entero 11; número entero 11/2 = 5 en la aritmética de enteros, que entonces Reparto para doblar (en la asignación)
  3. 5,0 + 6,0 es el doble de 11,0; dividir por doble doble dando 2,0 5,5
  4. 5 + 6 es número entero 11; hay una conversión implícita para duplicar 11.0 para la división, y se divide doble doble dando 2,0 5,5

Otros consejos

Para ampliar Marc de (correcto) responder a un poco, números enteros se interpretan como número entero, mientras que los números con puntos decimales se interpretan como doble. Para declarar un número entero como un doble literal, añadir una "D" para él:

        //CASE 2b, result 5.5
        double auxMedia2b = (5D + 6D) / 2;

Usted está correcto. Caso 2 usos aritmética de enteros hasta que se realiza la asignación. También puede solucionar el problema al hacer una conversión explícita:

double auxMedia1 = ((double) (5 + 6)) / 2;
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;

El resultado de la (5 + 6) operación es entero. Debido a que ambos operandos son de tipo entero. A continuación, las preformas compilador 11/2, donde ambos operando también son números enteros. El resultado de la última división es, obviamente, 5, porque es una división entera (no sé la palabra adecuada Inglés).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top