Округление чисел в Perl

В языке программирования Perl есть несколько способов как можно округлить число до целого.

В зависимости от того что необходимо получить в итоге нужно использовать разные способы. При выборе способа округления стоит обратить внимание на то как должны округляться отрицательные числа.

Вот таблица в которой показываются результаты разных способов округления. Все эти способы для округления доступны в Perl из коробки, если у вас есть Perl, вы можете использовать любой из этих способов.

                        -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

(Эта таблица была создана с помощью кода https://PerlBanjo.com/bf555d3112 ).

  • int($x) — отбрасывается дробная часть
  • POSIX::floor($x) — округляет всегда вниз
  • int($x + 0.5) — для положительных чисел работает по правилу математического округления, а для отрицательных чисел выдает какую-то ерунду
  • sprintf('%.0f', $x) — работает по правилу математического округления, как для положительных, так и для отрицательных чисел.
  • POSIX::ceil($x) — округляет всегда вверх

Округление до нескольких символов после запятой

Один из способов как можно округлить число до нескольких символов после запятой в Perl — это использовать sprintf("%.2f", $x).

Число в %.2f означает сколько нужно оставить цифр после запятой. Вот пример кода:

▶ 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());

Результат работы:

3
3.1
3.14
3.142
3.1416
3.14159

Способы округления в свежих версиях Perl

Начиная c версии Perl 5.22 в стандартной поставке Perl появились функции POSIX::trunc() и POSIX::round(), а с версии Perl 5.24 появилась функция POSIX::lround(). Вот таблица с результатом работы всех способов (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

Результаты POSIX::trunc($x) в этой таблице точно такие же как int($x). И точно так же результаты POSIX::round($x) и POSIX::lround($x) в этой таблицы точно такие же как sprintf('%.0f', $x).

Другие статьи