2012-05-31 7 views
5

que estoy tratando de solucionar el siguiente código Java,errores Java con números

No puedo entender por qué la impresión es todavía 5.

public class simpleMath 
{ 
    public static void main(String[] args) 
    { 
     int number=5; 
     half(number); 

     System.out.println("5 divided by 2 is: " + number); 

    } 

    private static double half(int number) { 
     number = number/2; 
     return number; 
    } 
} 
+0

Usted llama a su método de división, pero no se asigna el resultado de la misma. Pruebe System.out.println ("5 dividido por 2 es:" + medio (número)); pero, por supuesto, mejor es usar variables para mantener el resultado de la operación. – hovanessyan

Respuesta

-5

Primero debe saber qué tipos está asignando a sus variables.Debe cambiar el código para que se vea así:

public class simpleMath 
    { 


     public static void main(String[] args) 
     { 
      double number = 5; 
      double answer = half(number); 

      System.out.println(" 5 divided by 2 is:"+ answer); 

     } 

     private static double half(double number) { 
      number = number/2.0; 
      return number; 
     } 

    } 

¿Ve cómo ahora uso el valor devuelto y cómo lo divido por 2.0? estos cambios le darán los resultados que está buscando.

+0

¿por qué todos los votos a favor? Di una buena respuesta que sé que funciona – jth41

+2

Todos los votos abajo porque no * resuelves * el problema del PO, simplemente lo ocultas. Él no está asignando el valor de retorno de 'half (number)', ¿y tu solución es llamarlo de nuevo cuando imprima? Esto no va a * ayudar * al OP de ninguna manera. –

+0

wow totalmente extrañado. Simplemente lo ejecuté y asumí que era correcto. gracias por hacérmelo saber – jth41

9

Cuando se llama a la función, usted está desechando su valor de retorno:

half(number); 

probablemente la intención de escribir:

number = half(number); 

Además, en Java, los argumentos se pasan por valor. Esto significa que, aunque cambie number dentro de la función, el cambio no se propaga de vuelta a la persona que llama.

Hay varios problemas adicionales:

Problema 1: El cambio sugerido almacenará el resultado en number, que es una variable entera. Por lo tanto, el resultado de half() - que es del tipo double - se truncará a un número entero. Para evitar la pérdida de precisión, debe cambiar number para que sea una variable de coma flotante o almacenar el resultado en una variable diferente del tipo apropiado.

Problema 2: los siguientes usos división entera:

number = number/2; 

El resultado se trunca a un número entero, es decir 5/2 es 2. Este último se convierte a double (2.0), que es lo que devuelve la función.

Para corregir, cambiar la función de este modo:

private static double half(int number) { 
    return number/2.0; 
} 

P. S. Los números de coma flotante tienen muchas propiedades que pueden ser poco intuitivas. Recomiendo echar un vistazo a What Every Computer Scientist Should Know About Floating-Point Arithmetic.

+2

cierto, pero realmente no responde la pregunta, aunque es ...;) – Nim

+0

no, el número que obtengo es 5 – Yui2

17

Porque no está reasignando el valor devuelto.

int number = 5; 
number = half(number); 
0

Es porque no estamos asignando el valor de retorno de half()-number - que se calcula pero no se utiliza.

que necesita decir:

number = half(number); 

La forma en que lo tienes en la actualidad sólo funcionaría si number estaba siendo pasada por referencia, no por valor.

1

Pasa el tipo de datos primitivo que se realiza por valor. Debe dar SOP en el método half() EDITAR: Necesita usar el resultado devuelto por el método half() asignándolo al número o llamando a este método en SOP.

+0

Pero él devuelve el nuevo valor ... –

+1

Lo devuelve, pero no lo vuelve a asignar al 'número 'variable –

1

Por qué half(number) no modifica numberdeclaró en main() función? Es porque pasará el valor de number a la función half() para evaluar, es decir, usted proporciona una copia del valor en number a la función half(). Por lo tanto, cualquiera que sea la función half() a number no se reflejará de nuevo a number variable declarada en main(). Debe asignar el valor devuelto de half() a number en main() si desea actualizar su valor.

Hay otros casos, como sombreado variable, que no voy a detallar, ya que puede confundirte.

0
int number =5; 
half(number); 

Java no admite el pase por referencia. Entonces, en este caso estamos pasando un valor que es 5 y no una referencia de número.

Así que si queremos capturar los cambios, entonces llamada al método debería ser así -

public class simpleMath 
{ 
    public static void main(String[] args) 
    { 
     int number =5; 
     number = half(number); 

     System.out.println(" 5 divided by 2 is:"+ number); 

    } 

    private static double half(int number) { 
     number = number/2; 
     return number; 
    } 
}