Arrotondare un double per trasformarlo in un int (java)


119

In questo momento sto provando questo:

int a = round(n);

dov'è nun doublema non funziona. Che cosa sto facendo di sbagliato?



6
Dovresti davvero elaborare "non funziona" in modo più dettagliato. Che succede? Cosa non succede? Cosa ti aspettavi? Quali errori hai riscontrato? Hai un round()metodo nella stessa classe? L'hai fatto import static java.lang.Math.*? Ecc .. Ci sono molti modi per arrotondare i numeri e quindi anche molte possibili risposte. In altre parole, la tua domanda è vaga e ambigua e non può essere ragionevolmente risposto nella sua forma attuale. Sta girando nell'oscurità.
BalusC

1
"Non funziona" significa non arrotondare al più vicino int, o lanciare un'eccezione, o non arrotondare per eccesso / per difetto? Questa domanda è inutile senza dover incrociare il contesto con la risposta.
modulitos

Risposte:


239

Qual è il tipo restituito del round()metodo nello snippet?

Se questo è il Math.round()metodo, restituisce un Long quando il parametro di input è Double.

Quindi, dovrai eseguire il cast del valore restituito:

int a = (int) Math.round(doubleVar);

1
Considerare l'utilizzo di Math.toIntExact (long) invece di eseguire il cast a un int; un double può contenere una vasta gamma di valori e probabilmente non vuoi buttare via silenziosamente i bit più significativi se il tuo double è più grande di quanto ti aspetti.
othp

Credo che il cast non sia necessario. Non so se fosse in passato, ma round restituisce int.
Ritiro

@Dropout Math.round restituisce un int se gli dai un float e un long se gli dai un double.
Tur1ng

27

Se non ti piace Math.round () puoi usare anche questo semplice approccio:

int a = (int) (doubleVar + 0.5);

4
Non v'è chiaramente alcun motivo valido per non gradimento Math.round(): stackoverflow.com/a/6468757/1715716
Gauthier Boaglio

3
Questa soluzione è più breve, non necessita di importazione ed è portabile in molti altri linguaggi di programmazione con modifiche minime. E potrebbe anche essere più veloce a seconda della piattaforma: stackoverflow.com/questions/12091014/...
Dr. Daniel Thommes

1
Non sto criticando la tua risposta, che trovo molto utile per il motivo che citi. Con questo commento mi stavo rivolgendo a persone che avrebbero paura di usare Math.round(), il che è "letteralmente" uguale alla soluzione che fornisci, tutto qui. Saluti.
Gauthier Boaglio

2
Sì, come ha detto nehz, credo che questo arrotonderebbe da -2,1 a -1, per esempio.
Ben Aaronson

5
@AlbertoHormazabal, non hai notato che ha aggiunto 0.5?
Sasha

11

A completare doppio alla "più vicino" intero in questo modo:

1.4 -> 1

1,6 -> 2

-2,1 -> -2

-1,3 -> -1

-1,5 -> -2

private int round(double d){
    double dAbs = Math.abs(d);
    int i = (int) dAbs;
    double result = dAbs - (double) i;
    if(result<0.5){
        return d<0 ? -i : i;            
    }else{
        return d<0 ? -(i+1) : i+1;          
    }
}

Puoi modificare la condizione (risultato <0,5) come preferisci.


Sono d'accordo con la risposta dell'anivaler. Ma se hai bisogno di arrotondare solo al numero intero più alto, puoi come di seguito: double decimalNumber = 4.56777; System.out.println (new Float (Math.round (decimalNumber))); Uscita: 5
Smeet

3
import java.math.*;
public class TestRound11 {
  public static void main(String args[]){
    double d = 3.1537;
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
    // output is 3.15
    System.out.println(d + " : " + round(d, 2));
    // output is 3.154
    System.out.println(d + " : " + round(d, 3));
  }

  public static double round(double d, int decimalPlace){
    // see the Javadoc about why we use a String in the constructor
    // http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double)
    BigDecimal bd = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
  }
}

3

La funzione Math.round è sovraccarica Quando riceve un valore float, ti darà un int. Ad esempio, questo funzionerebbe.

int a=Math.round(1.7f);

Quando riceve un valore doppio, ti darà un long, quindi devi tipizzarlo su int.

int a=(int)Math.round(1.7);

Questo viene fatto per evitare la perdita di precisione. Il tuo valore doppio è 64 bit, ma poi la tua variabile int può memorizzare solo 32 bit, quindi la converte in long, che è 64 bit ma puoi convertirla in 32 bit come spiegato sopra.


1

Documentazione di Math.rounddice:

Restituisce il risultato dell'arrotondamento dell'argomento a un numero intero . Il risultato è equivalente a (int) Math.floor(f+0.5).

Non c'è bisogno di trasmettere a int. Forse è stato cambiato rispetto al passato.


4
Esistono 2 metodi Math.round. Quello che prende un float restituisce un numero intero, che è corretto. Ma quello che prende un doppio restituisce un lungo.
Dominik Ehrenberg

0
public static int round(double d) {
    if (d > 0) {
        return (int) (d + 0.5);
    } else {
        return (int) (d - 0.5);
    }
}

-1

Hai davvero bisogno di pubblicare un esempio più completo, così possiamo vedere cosa stai cercando di fare. Da quello che hai postato, ecco cosa posso vedere. Innanzitutto, non esiste un round()metodo integrato . Devi chiamare Math.round(n)o importare staticamente Math.round, quindi chiamarlo come hai fatto.


Non ci sono funzioni globali in java, tanto per cominciare.
Danon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.