2011-10-21 5 views
5

ho avere un valore come questo:Come arrotondare un numero entro un determinato intervallo?

421.18834 

E devo arrotondare matematico correttamente con una maschera che può apparire come questo:

0.05 
0.04 
0.1 

Per esempio, se la maschera è 0,04, i deve ottenere il valore 421.20, perché .18 è più vicino a 0,20 di .16.

Tutte le funzioni che ho trovato utilizzando Google non funzionavano.

Potete aiutarmi per favore?

risposta

9
double initial = 421.18834; 
double range = 0.04; 

int factor = Math.round(initial/range); // 10530 - will round to correct value 

double result = factor * range; // 421.20 
+1

dovrebbe questo '(int) (iniziale/intervallo)' round correttamente? Come ho visto qualche mese fa, questo taglia solo i decimali, invece di arrotondare (lo stesso in PHP, credo). Se uso Math.round, funziona. –

+0

Ben avvistato, il mio Java è un po 'arrugginito :-) Ma 'Math.round()' * lo farà * correttamente! – fredley

3

Non è necessaria una funzione speciale. Si moltiplica il numero originale di (1/maschera), si arrotonda a un decimale e si divide nuovamente dello stesso fattore.

  • Esempio con 0,05

    factor = 1/0.05 = 20 
    421.18834 * 20 = 8423.7668 
    int( 8423.7668) = 8424 
    8424.0/20.0 = 421.20 
    
  • Esempio con 0,01

    factor = 1/0.1 = 10 
    421.18834 * 10 = 4211.8834 
    int(4211.8834) = 4212 
    4212.0/10.0 = 421.20 
    
+2

Attenzione: in Java, '4212/10' non produce' 421.20'! – fredley

2

Sia Fredley e Matteo fa l'ipotesi che il fattore di arrotondamento è essa stessa un fattore di 100. Per fattori come 0.06 o 0.07, questa è un'ipotesi errata.

Ecco la mia routine Java:

public double rounded(double number, double factor) { 
    long integer = (long) number; 
    double fraction = number - integer; 
    double multiple = (fraction/factor); 
    multiple = Math.round(multiple); 
    return factor * multiple + integer; 
} 
1

Contrariamente a tutte le risposte che probabilmente arriverai qui circa moltiplicazione e divisione, non si può fare questo con precisione, perché in virgola mobile non ha cifre decimali. Avere bisogno di convertire in un decimale decimale e poi in tondo. BigDecimal lo fa.