2012-08-23 52 views
8

No se pudo pensar en un título mejor. Bueno, el problema es: Tengo el "int i", puede ser cualquier valor. mi objetivo es transformar el "int i" en el número más cercano divisible por .Java - ¿Cómo comprobar si una división es un número entero o un número flotante?

Por ejemplo, tengo i = 33. Luego me darán vuelta a (16x2). Pero si obtengo i = 50, entonces se convertirá en (16x3).

He intentado muchas cosas, por ejemplo:

for (int x = i; x < 999; x++){ 
if ((i - x)/16 *is an integer*){ 
i = i - x; 
} 

pero no sé cómo comprobar si su un entero. Así que tal vez mi código anterior funciona, pero solo necesito encontrar una manera de verificar si es un número entero o un flotador. Asi que se agradece cualquier ayuda.

+4

La división de dos entradas siempre tendrá un resultado int. Puede usar módulo ('%') en su lugar. – GriffeyDog

+0

FWIW, sugiero probar un enfoque diferente para resolver este problema. Este enfoque de bucle para buscar un número que pueda restar de i para obtener un múltiplo de 16 es terriblemente ineficiente. ¿Y si el múltiplo más cercano de 16 es mayor que yo? – Alex

Respuesta

5

Dado que todos los enteros de los cuales son divisibles por 16 tendrán sus últimos 4 bits todo listo a 0. Esto se puede hacer lo que quiere sin un bucle o incluso una sentencia if:

i &= 0xfffffff0; // Sets i to the greatest multiple of 16 less than i, or 0 for i < 16 

por ejemplo:

int i = 50; 
i &= 0xfffffff0; // i == 48 

i = 39; 
i &= 0xfffffff0; // i == 32 

i = 16; 
i &= 0xfffffff0; // i == 16 
+0

¡Funciona a la perfección! – user1541106

4

(i - x)/16 es número entero cuando resto de (i - x)/16 es 0. Uso% (módulo) operador como:

if((i - x)%16 == 0) { 
    // (i-x)/16 is integer 
} 
12

Use el operador mod. Mod te da el resto de una operación de división.

public boolean isEvenlyDivisable(int a, int b) { 
    return a % b == 0; 
} 
1

Para saber si un número se divide uniformemente otra, echa un vistazo a las otras respuestas, de módulo (%) es la forma de hacerlo.

Para hacer lo que quiere hacer antes, que no necesitan un bucle:

public int nearestDivider(final int input) 
{ 
    final int multiple = input/16; // this will divide by 16 and it's integer math, so it loses the decimal 
    return multiple * 16; 
} 

que devolverá 48 si se le da 50 como su ejemplo.

Si realmente quiere más cercana, entonces tendrá que hacer alguna división en coma flotante

public int nearestDivider(final int input) 
{ 
    final int multiple = Math.round((float) input/16); 
    return multiple * 16; 
} 

Ahora regresa 46 48, 149 144 vuelve etc.

+0

Dependiendo de la definición de "más cercano", es posible que necesite agregar 16. – Alex

+0

Es cierto que sus ejemplos (y el código) parecían indicar que deseaba el valor más cercano o igual a ... – xbakesx

+0

Sí, es un tanto difícil de inferir la intención de un tamaño de muestra de 2 ... – Alex

4

Hay una serie de cuestiones con llamativos su código original:

  1. Si está redondeando al múltiplo de 16 más cercano, se deduce que el valor más alto que posiblemente tenga para substráver actuar es 15. Por lo tanto, el límite superior de su bucle debería ser como máximo 15.
  2. Como han notado otros, podría usar el operador de módulo (%) para determinar el valor exacto para restar de un valor dado para redondearlo al múltiplo más cercano de 16. Esto elimina la necesidad de un bucle por completo.
  3. Pero como 16 es una potencia de 2, y dado que los enteros se representan como un número binario con 32 dígitos (es decir, 32 bits), puede calcular el valor más directamente utilizando una máscara de bits para poner a cero cualquier dígito menor que 16 en la número. En Java, puede utilizar el operador binario & para este fin, como este: i & 0xfffffff0. Esto pondrá a cero los últimos 4 dígitos (los que representan: 8-4-2-1), lo que efectivamente redondea su número al valor más cercano divisible entre 16.
  4. Si necesita realizar una división de números enteros e ignorar cualquier resto, simplemente puede cambiar (>>) por 4 bits para hacer eso en su lugar.
0

Si necesita el múltiplo más próximo de 16, entonces se tienen dos casos para hacer frente a los múltiplos impares de 8. 1. 8 se convierte en 16, 24 se convierte en 32 2. 8 se convierte en 0, 24 se convierte en 16

Para el primero:

int j = ((i+8)/16)*16; 

En el segundo caso:

int j = ((i+7)/16)*16; 

Si desea, siempre desea redondear ABAJO (es decir 17 se convierte en 16, y 15 se convierte en 0):

int j = (i/16)*16; 

Si quería siempre Round Up (no lo que dice su ejemplo), que habría hecho esto en su lugar:

int j = ((i+15)/16)*16; 
0

Con el fin de comprobar si un azar resultados de la división de un entero o fracción que necesitan lo siguiente:

int n = 9; 
int p = 3; 

if (n % p == 0) { 
    //the division results in an integer. 
} 
else 
{ 
    //the division results in a fraction. 
} 

Usted puede hacer esto como una alternativa:

if (n/p == Math.ceil((double) n/(double) p)) { 
    //the division results in an integer. 
} 
else 
{ 
    //the division results in a fraction. 
} 

Uno necesita Matemáticas .ceil() y no es redonda o en el piso, porque una división entera es casi igual a un piso y la fracción se redondeará hacia abajo y aparecerá como 'división entera'.

Cuestiones relacionadas