¿Hay alguna función o util clase Java que no redondeo de esta manera: func (3/2) = 2?

StackOverflow https://stackoverflow.com/questions/1074228

  •  21-08-2019
  •  | 
  •  

Pregunta

¿Hay alguna función de Java o util class lo que hace el redondeo de esta manera: func(3/2) = 2

Math.ceil() no ayuda, la cual por su nombre debería haber hecho. Soy consciente de BigDecimal, pero no lo necesito.

¿Fue útil?

Solución

Math.ceil() siempre redondear hacia arriba, sin embargo, usted está haciendo una división entera con 3/2. Por lo tanto, ya que en la división de enteros 3/2 = 1 (no 1.5) el techo de 1 es Math.ceil(3/2.0);.

Lo que tendría que hacer para lograr los resultados que desea es 2.0

Al hacer la división por una cantidad doble (3/2.0 = 1.5), que terminan haciendo división de coma flotante en lugar de la división entera. Por lo tanto ceil(), y la 2 de <=> es siempre <=>.

Otros consejos

Un poco de magia negro, y usted puede hacerlo todo con números enteros:

// Divide x by n rounding up
int res = (x+n-1)/n

Siempre se puede echar en primer lugar:

Math.ceil((double)3/2)

Para convertir la división de suelo a techo división:

(numerator + denominator-1) / denominator

Para convertir la división de suelo para la división de redondeo:

(numerator + (denominator)/2) / denominator

En Java, 3/2 = 1, ya que utiliza la división entera. No hay ninguna función que puede "arreglar" esto después. Lo que tiene que hacer es forzar una divisón flotador y redondear el resultado:

int result = (int)Math.ceil( ((float)3) / ((float)2) );

Aint este el caso habitual de la división entera? Trate Math.ceil después de emitir cualquiera de los números a un tipo de punto flotante.

Muchos lenguajes "piensan" como este. Si está dividiendo un int en un int, entonces usted debe conseguir un int (por lo que truncará y se obtiene como resultado 1).

Todos sabemos que esto no es cierto, pero eso es cómo funcionan. Puede "trampa", y hacer algo como echar a uno de ellos a un doble, o utilizar una doble representación:. Math.ceil (3.0 / 2) o Math.ceil((double)3/2), como se mencionó

Math.ceil ayuda, siempre y cuando use números de punto flotante. El problema es que 3/2, en la división entera, es 1. Cuando el valor llega a cualquier función, ya sea Math.ceil o alguna otra cosa, el valor es simplemente 1. Cualquier parte decimal de salida se ha ido.

if (a % b == 0)
{
  return (a / b);
}
else
{
  return (a / b) + 1;
}

Explota división entera a hacer lo que quiera. No sé de una función matemática que hace esto, pero por qué no rodar su propia?

a continuación fragmento trabaja con números enteros negativos, así:

public static int divRoundUp(int x, int n) {
    if (n<=0) throw new RuntimeException("conceived wt. pos. dividers (was:"+n+")");
    int ret = (x+(n-1)*(x>0?1:0))/n;
    return ret;
}

Me gusta la respuesta de Randy Proctor los mejores. Aquí en más detalle:

Si usted quiere hacer el redondeo real (es decir, 3/2 -> 2, pero 17/7 -> 2) con números enteros> 0: utilizar (dividend + (divisor / 2)) / divisor lugar de dividend / divisor.

Si dividendo puede ser cualquier entero (es decir, negativo permitido): (dividend >= 0) ? ((dividend + divisor / 2) / divisor) : ((dividend - divisor / 2) / divisor).

Si dividendo es cualquier número entero y Divisor cualquier entero pero 0: (dividend >= 0) ? ((dividend + Math.abs(divisor) / 2) / divisor) : ((dividend - Math.abs(divisor) / 2) / divisor).

(Tenga en cuenta que la adición y sustracción pueden causar una envolvente que de otro modo no tendría lugar, haciendo que el resultado incorrecto.)

Este es un método que he creado para manejar la división int sin utilizar matemáticas Ronda y echando a flotar. Esto funciona para los números positivos y negativos. Funciona mediante la adición de la mitad del denominador para compensar el redondeo a la baja

public static int div_Int(int num, int den){
    if(num > 0 && den > 0 || num < 0 && den < 0 ){
        return ((2*num)+ den)/(2*den);  
    }else{
        return ((2*num)- den)/(2*den);
    }

}

Si quiere simplemente dividir por 2, que puede hacer:

n - n / 2

Y en general:

(n - 1) / d + 1 == (n + d - 1) / d

Esto es válido para los números enteros no negativos. Cómo extender a números enteros negativos depende de lo que quieres decir con "no redondeo de esta manera". La división entera se redondea hacia cero, mientras que Math.ceil() redondea y Math.floor() redondea hacia abajo. Por ejemplo n / 2 != (int) Math.floor(n / 2.0) para n == -5.

Si desea redondear siempre, puede utilizar <=> como en esta respuesta .

Si realmente desea evitar el uso techo y el bastidor, aquí es un poco de método que consigue el mismo efecto.

public int findCeil(int X, int Y) {
        if (X % Y == 0){
            return X / Y;
        } else {
            return X / Y + 1;
        }
    }

¿Ha tratado Math.floor()?

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