C'è qualche funzione o util classe Java che non arrotondamento in questo modo: func (3/2) = 2?

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

  •  21-08-2019
  •  | 
  •  

Domanda

C'è qualche funzione Java o util class che fa arrotondamento in questo modo: func(3/2) = 2

Math.ceil() non risolve il problema, che per nome avrebbe dovuto fare così. Sono a conoscenza di BigDecimal, ma non ne ho bisogno.

È stato utile?

Soluzione

Math.ceil() sarà sempre arrotondare, ma si sta facendo divisione intera con 3/2. Così, dal momento che in divisione intera 3/2 = 1 (non 1.5) al massimale di 1 è Math.ceil(3/2.0);.

Che cosa si avrebbe bisogno di fare per raggiungere i risultati desiderati è 2.0

Facendo la divisione per una quantità doppia (3/2.0 = 1.5), si finisce per fare divisione in virgola mobile invece di divisione intera. Così ceil(), e la 2 di <=> è sempre <=>.

Altri suggerimenti

Un po 'di magia nera, e si può fare tutto con numeri interi:

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

Si può sempre lanciare prima:

Math.ceil((double)3/2)

Per convertire divisione pavimento al soffitto divisione:

(numerator + denominator-1) / denominator

Per convertire la divisione piano di divisione arrotondamento:

(numerator + (denominator)/2) / denominator

In Java, 3/2 = 1 perché utilizza divisione intera. Non c'è alcuna funzione in grado di "fissare" questo in seguito. Quello che devi fare è quello di forzare un divison galleggiante e arrotondare il risultato:

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

Aint questo caso usuale di divisione intera? Prova Math.ceil dopo la fusione o il numero di un tipo in virgola mobile.

Molte lingue "pensano" come questo. Se si sta dividendo un int in un int, allora si dovrebbe ottenere un int (in modo da troncare e si ottiene 1 come risultato).

Sappiamo tutti che questo non è vero, ma questo è il modo in cui funzionano. È possibile "barare", e fare qualcosa di simile colata uno di loro a un doppio, o utilizzare una doppia rappresentazione:. Math.ceil (3.0 / 2) o Math.ceil((double)3/2), come detto

Math.ceil di aiuto, a patto di utilizzare numeri in virgola mobile. Il problema è che 3/2, nella divisione intera, è 1. Con il tempo il valore arriva a qualsiasi funzione, sia esso Math.ceil o qualcos'altro, il valore è semplicemente 1. Qualsiasi parte decimale finale è andato.

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

Sfrutta la divisione intera a fare quello che vuoi. Non so di una funzione matematica che fa questo, ma perché non rotolare il proprio?

seguito frammento funziona con interi negativi così:

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;
}

mi piace la risposta migliore di Randy Proctor. Qui in dettaglio:

Se si vuole fare vero e arrotondamento (vale a dire 3/2 -> 2, ma 17/7 -> 2) con gli interi> 0: utilizzare (dividend + (divisor / 2)) / divisor invece di dividend / divisor.

Se dividendo può essere qualsiasi numero intero (cioè negativo consentito): (dividend >= 0) ? ((dividend + divisor / 2) / divisor) : ((dividend - divisor / 2) / divisor).

Se dividendo è qualsiasi numero intero e divisor qualsiasi numero intero, ma 0: (dividend >= 0) ? ((dividend + Math.abs(divisor) / 2) / divisor) : ((dividend - Math.abs(divisor) / 2) / divisor).

(Si noti che l'aggiunta e la sottrazione possono causare un avvolgente che altrimenti non si verificherebbe, rendendo il risultato non corretto.)

Qui è un metodo che ho creato per gestire la divisione int senza usare la matematica rotonda e la colata di galleggiare. Questo funziona per i numeri positivi e negativi. Funziona con l'aggiunta della metà del denominatore per compensare l'arrotondamento per difetto

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);
    }

}

Se si desidera dividere solo con 2, si può fare:

n - n / 2

E in generale:

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

Questo vale per i numeri interi non negativi. Come estenderla ai numeri interi negativi dipende da cosa si intende con "non arrotondamento in questo modo". divisione intera è arrotondato verso zero, mentre Math.ceil() arrotonda e Math.floor() arrotonda. Per esempio n / 2 != (int) Math.floor(n / 2.0) per n == -5.

Se si desidera arrotondare sempre, è possibile utilizzare <=> come in questa risposta .

Se davvero si vuole evitare l'uso di soffitto e di colata, ecco un po 'di metodo che compie la stessa cosa.

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

Hai provato Math.floor()?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top