Я до сих пор не понимаю, как работают правила, но игра с bfround
из Math :: BigFloat может вернуть то, что вы хотите.
#!/usr/bin/perl
use warnings;
use feature qw{ say };
use Math::BigFloat;
sub myround {
my $bi = 'Math::BigFloat'->new("$_[0]");
for (my $l = length $bi; $l > 1; --$l) {
$bi->bfround(-$l, '+inf');
}
$bi
}
use Test::More tests => 8;
is myround(4.444435), 4.44;
is myround(4.444445), 4.45;
is myround(4.445444), 4.45;
is myround(4.443000), 4.44;
is myround(3.554444), 3.55;
is myround(3.554445), 3.56;
is myround(3.544445), 3.55;
is myround(3.555550), 3.56;