2011-02-04 16 views
6

Wydaje się proste pytanie, ale Naprawdę ssać matematyki i kilka przykładów online Szukałem nie działa dla mnie. (Wynik po prostu wrócić taką samą wartość jak wejście etc)Java - jak zaokrąglić wartość float (lub BigDecimal) o 0,5?

Na przykład .. ale jej w C nie Java Round to Next .05 in C

Więc moim celem jest Mam formatu %.1ffloat lub double lub big decimal i chcąc rundzie go do najbliższego .5

example: 

1.3 --> 1.5 
5.5 --> 5.5 
2.4 --> 2.5 
3.6 --> 4.0 
7.9 --> 8.0 

próbowałem następujący przykład, ale nie działa :(poniżej tylko wyjścia 1.3, która jest oryginalna wartość. chciałem być 1,5

public class tmp { 

    public static void main(String[] args) { 

     double foo = 1.3; 

     double mid = 20 * foo; 

     System.out.println("mid " + mid); 

     double out = Math.ceil(mid); 

     System.out.println("out after ceil " + out); 

     System.out.printf("%.1f\n", out/20.0); 
    } 
} 

Odpowiedz

8

Mnożenie (i później dzielenie) przez 2, a nie 20, powinno wystarczyć.

+0

omg to działa! : D dzięki! Powinienem studiować matematykę jako programistę! Mógłbym nawet zrobić tę samą rundę z podłogą() też, niesamowita –

17

Oto prosty sposób:

public static float roundToHalf(float x) { 
    return (float) (Math.ceil(x * 2)/2); 
} 

To podwaja wartość, bierze swój pułap i przecina go na pół.

+0

Dzięki za przykładowy kod :) +1 –

4
double nearestPoint5 = Math.ceil(d * 2)/2; 
4

Zobacz Big Decimal Javadoc o tym, dlaczego ciąg jest używany w konstruktorze

public static double round(double d, int decimalPlace){ 
    BigDecimal bd = new BigDecimal(Double.toString(d)); 
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP); 
    return bd.doubleValue(); 
} 
1

bez użycia funkcji można zrobić

double rounded = (double)(long)(x * 2 + 0.5)/2; 

Uwaga: Ta runda będzie ku nieskończoności.

4

Poniższy wzór nie działa dobrze dla ilości jak 2,16

public static float roundToHalf(float x) { 
    return (float) (Math.ceil(x * 2)/2); 
} 

Prawidłowe odpowiedzi powinno być 2,0, lecz powyższa metoda daje 2,5

prawidłowy kod powinien być:

public static double round(float d) 
{ 
    return 0.5 * Math.round(d * 2); 
} 
-1

Niektóre inne odpowiedzi są nieprawidłowo używane (należy użyć Math.round, a nie Math.floor lub Math.ceil) i innych y pracujesz dla zaokrąglania do 0.5 (o to właśnie pytano, tak). Oto prosta metoda, która poprawnie zaokrągla się do najbliższego arbitralnego podwójnego, z kontrolą, aby upewnić się, że jest to liczba dodatnia.

public static double roundToNearest(double d, double toNearest) { 
    if (toNearest <= 0) { 
     throw new IllegalArgumentException(
       "toNearest must be positive, encountered " + toNearest); 
    } 
    return Math.round(d/toNearest) * toNearest; 
}