Zaokrąglanie liczb w Perl

W języku programowania Perl istnieje kilka sposobów, jak można zaokrąglić liczbę do wartości całkowitej.

W zależności od tego co chcesz uzyskać w końcu trzeba używać różnych sposobów. Przy wyborze sposobu zaokrąglania warto zwrócić uwagę na to jak powinny округляться liczby ujemne.

Oto tabela, w której wyświetlane są wyniki różnych sposobów zaokrąglania. Wszystkie te sposoby zaokrąglania są dostępne w Perlu z pudełka, jeśli masz Perl, można możesz użyć dowolnej z tych metod.

                        -1.8  -1.5  -1.2   0     1.2   1.5   1.8
.................................................................
int($x)                 -1    -1    -1     0     1     1     1
POSIX::floor($x)        -2    -2    -2     0     1     1     1
int($x + 0.5)           -1    -1     0     0     1     2     2
sprintf('%.0f', $x)     -2    -2    -1     0     1     2     2
POSIX::ceil($x)         -1    -1    -1     0     2     2     2

(Tabela ta została utworzona za pomocą kodu https://PerlBanjo.com/bf555d3112 ).

  • int($x) — wyrzucić część ułamkowa
  • POSIX::floor($x) — zaokrągla zawsze w dół
  • int($x + 0.5) — dla liczb dodatnich działa na zasadzie matematycznego zaokrąglania, a dla liczb ujemnych daje coś głupiego
  • sprintf('%.0f', $x) — działa na zasadzie matematycznego zaokrąglania, zarówno pozytywnych, jak i dla liczb ujemnych.
  • POSIX::ceil($x) — zaokrągla zawsze w górę

Zaokrąglenie do kilku znaków po przecinku

Jeden ze sposobów jak można zaokrąglić liczbę do kilku znaków po przecinku w Perl — to jest użyć sprintf("%.2f", $x).

Liczba w %.2f oznacza ile trzeba zostawić cyfr po przecinku. Oto przykład kodu:

▶ Run
#!/usr/bin/perl

use feature qw(say);
use Math::Trig;

say sprintf("%.0f", pi());
say sprintf("%.1f", pi());
say sprintf("%.2f", pi());
say sprintf("%.3f", pi());
say sprintf("%.4f", pi());
say sprintf("%.5f", pi());

Wynik pracy:

3
3.1
3.14
3.142
3.1416
3.14159

Sposoby zaokrąglania w nowszych wersjach Perla

Począwszy od wersji Perl 5.22 w standardowej dostawie Perl pojawiły się opcje POSIX::trunc() i POSIX::round(), a z wersji Perl 5.24 pojawiła się funkcja POSIX::lround(). Oto tabela z wynikiem pracy wszystkich sposobów (https://PerlBanjo.com/4314405cde ):

                        -1.8  -1.5  -1.2   0     1.2   1.5   1.8
.................................................................
int($x)                 -1    -1    -1     0     1     1     1
POSIX::trunc($x)        -1    -1    -1     0     1     1     1
POSIX::floor($x)        -2    -2    -2     0     1     1     1
int($x + 0.5)           -1    -1     0     0     1     2     2
POSIX::round($x)        -2    -2    -1     0     1     2     2
POSIX::lround($x)       -2    -2    -1     0     1     2     2
sprintf('%.0f', $x)     -2    -2    -1     0     1     2     2
POSIX::ceil($x)         -1    -1    -1     0     2     2     2

Wyniki POSIX::trunc($x) w tej tabeli są dokładnie takie same jak int($x). I dokładnie tak samo wyniki POSIX::round($x) i POSIX::lround($x) w tej tabeli dokładnie takie same jak sprintf('%.0f', $x).

Inne artykuły