Zaokrąglanie liczb z zadaną dokładnością Drukuj
Ocena użytkowników: / 6
SłabyŚwietny 
Wpisany przez Patryk yarpo Jar   
czwartek, 11 lutego 2010 18:15

Jeśli chcemy w JS sprowadzić liczbę z częścią ułamkową do liczby całkowitej możemy wykorzystać statyczną metodę Math.round(liczba). Metoda ta przyjmuje jeden parametr, jest to liczba, która zostanie zaokrąglona wg prawideł matematycznych. Co jednak kiedy chcemy uzyskać zadaną liczbę miejsc po przecinku?

Nie ma wprost metody zaokraglanie(liczba, n). Można jednak łatwo napisać funkcję, która to dla nas zrobi:

 

function Round(n, k) {
    var factor = Math.pow(10, k);
    return Math.round(n*factor)/factor;
}
 
 var example = 12.345453534534;
 alert(Round(example, 2));
 alert(Round(example, 1));
 alert(Round(example, 0));
 alert(Round(example, 15));

W wyniku otrzymamy kolejno: 12.34, 12.3, 12.3, 12, 12.345453534534.

 

Ulepszenia

Powyższy kod działa. Jednak ma kilka wad:

  1. w rzeczywistości nie zaokrągla, a jedynie ucina w odpowiednim miejscu liczbę - dla pierwszego przykładu powinien zwrócić 12.35
  2. nie jest podpięty pod żaden obiekt, a więc łatwo może zostać nadpisany (w dużym projekcie, jeśli nie zaczniesz dzielić kodu na moduły na pewno gdzieś ktoś wpadnie na pomysł by nazwać jakąś funkcję tak samo - wJS nie dostaniesz żadnego komuniaktu - ot, kod będzie jedynie źle działał)

 

Łata #1

function Round(n, k) {
    var factor = Math.pow(10, k+1);
    n = Math.round(Math.round(n*factor)/10);
    return n/(factor/10);
}
alert(Round(12.345453534534, 2));
alert(Round(12.344, 2));
alert(Round(12.5, 0));
alert(Round(12.345453534534, 15));

Wynik: 12.35, 12.34, 13, 12.345453534534

 

Łata #2

Math.decimal = function(n, k) {
    var factor = Math.pow(10, k+1);
    n = Math.round(Math.round(n*factor)/10);

    return n/(factor/10);
}
alert(Math.decimal(12.345453534534, 2));
alert(Math.decimal(12.344, 2));
alert(Math.decimal(12.5, 0));
alert(Math.decimal(12.345453534534, 15));

 

W ten sposób otrzymujemy całkiem solidany kawałek kodu. Nie waliduje się tu w żaden sposób danych. Często to niedopuszczalne. Pamiętaj jednak o zasadzie YANGNI ("You Are Not Gonna Need It"). Nie koduj na zapas, chyba że dla praktyki :) [ten artykuł miał pokazać zasadę, a nie dostarczać gotowca piorącego, sprzątającego i zmywającego po obiedzie]