2011-11-22 4 views
26

Sto usando java.util.Random per generare un gaussiano casuale. Devo convertire questo gaussiano in un valore float. Comunque il gaussiano è un doppio, quindi ho bisogno di un modo per arrotondare e poi convertirlo in un float. Devo arrotondare al numero intero più vicino, arrotondando per eccesso. Ecco la mia domanda: come?Come arrotondare il doppio al numero intero più vicino e poi convertirlo in float?

+1

"ho bisogno di convertire questo gaussiana a un valore float." ... "Devo arrotondare al numero intero più vicino" ... Vuoi un float o un intero? –

+1

Vuoi arrotondare o vuoi arrotondare al numero intero più vicino? –

+1

Vuoi arrotondare il numero intero più vicino o arrotondare? Quelle sono dichiarazioni incompatibili. per esempio. Come faresti circolare 3.4? Il numero intero più vicino è 3, arrotondando per eccesso è 4. – user949300

risposta

50

float b = (float)Math.ceil(a); o float b = (float)Math.round(a);

A seconda se si intende "arrotondare al numero intero più vicino" (tondo) o "arrotondare" (ceil).

Attenzione alla perdita di precisione nella conversione di un doppio in un float, ma non dovrebbe essere un problema qui.

+0

Grazie per la risposta, esattamente quello che stavo chiedendo per – JAW1025

8

Ecco un breve esempio:

public class One { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     double a = 4.56777; 
     System.out.println(new Float(Math.round(a))); 

    } 

} 

il risultato e uscita sarà: 5.0
Float limite superiore più vicino al valore iniziale di double a = 4.56777
in questo caso l'uso del turno è raccomandato poiché contiene valori double e fornisce valori interi long

R egards

+0

'(float) Math.round (a)' è molte volte più efficiente sia nel tempo che nello spazio. – EJP

+0

concordato. Si dovrebbe usare 'Float a = new Float (" 3.14 ")' solo quando è necessario accedere ai metodi ereditati dell'oggetto Super-class, come 'clone, toString, equals' e così via. 'float a = (float) 3.14;' si comporta molto male in un approccio OOP. – VeRo

+0

Non so cosa abbia a che fare con 'Float a = new Float (" 3.14 ")'. Né l'OP né io né voi avete detto nulla a riguardo, né a proposito di OOP. – EJP

0

Per ciò che vale:

il numero intero più vicino a qualsiasi ingresso come mostrato nella tabella seguente può essere calcolata utilizzando Math.ceil o Math.floor a seconda della distanza tra l'ingresso e l'intero successivo

+-------+--------+ 
| input | output | 
+-------+--------+ 
|  1 |  0 | 
|  2 |  0 | 
|  3 |  5 | 
|  4 |  5 | 
|  5 |  5 | 
|  6 |  5 | 
|  7 |  5 | 
|  8 |  10 | 
|  9 |  10 | 
+-------+--------+ 

private int roundClosest(final int i, final int k) { 
    int deic = (i % k); 
    if (deic <= (k/2.0)) { 
     return (int) (Math.floor(i/(double) k) * k); 
    } else { 
     return (int) (Math.ceil(i/(double) k) * k); 
    } 
}