2011-10-21 5 views
5

Mam wartość takiego:Jak zaokrąglić liczbę do określonego zakresu?

421.18834 

I muszę zaokrąglić go matematyczny poprawnie z maską, która może wyglądać następująco:

0.05 
0.04 
0.1 

Na przykład, jeśli maską wynosi 0,04, i Muszę uzyskać wartość 421.20, ponieważ .18 jest bliżej w .20 niż .16.

Wszystkie funkcje, które znalazłem za pomocą Google, nie działały.

Czy możesz mi pomóc?

Odpowiedz

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

Czy ten "(int) (początkowy/zakres)' runda poprawnie? Jak widziałem kilka miesięcy temu, to po prostu przecina dziesiętne zamiast zaokrąglania (tak samo w PHP, chyba). Jeśli używam Math.round, to działa. –

+0

Dobrze zauważyłem, moja Java jest nieco zardzewiała :-) Ale 'Math.round()' * zrobi to poprawnie! – fredley

3

Nie potrzebujesz specjalnej funkcji. Mnożysz swoją oryginalną liczbę przez (1/maskę), zaokrąglasz ją do dziesiętnej i dzielisz ponownie przez ten sam czynnik.

  • Przykład z 0,05

    factor = 1/0.05 = 20 
    421.18834 * 20 = 8423.7668 
    int( 8423.7668) = 8424 
    8424.0/20.0 = 421.20 
    
  • Przykład z 0,01

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

Uwaga: W Javie '4212/10' nie tworzy' 421.20'! – fredley

2

Zarówno fredley Matteo zrobić założenie, że czynnik zaokrąglenia jest sama w sobie czynnikiem 100. czynniki takie jak 0,06 lub 0,07, jest to niepoprawne założenie.

Oto moja rutyna 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

przeciwieństwie do wszystkich odpowiedzi prawdopodobnie będzie się tu o mnożenie i dzielenie, nie można tego zrobić, bo dokładnie zmiennoprzecinkowych nie ma miejsca po przecinku. Konieczne jest przekonwertowanie na liczbę dziesiętną, a następnie zaokrąglenie. BigDecimal to robi.