Вот скрипт Perl:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @numbers = qw(
0.254
0.255
0.256
);
foreach my $number (@numbers) {
my $rounded = sprintf '%.2f', $number;
say "$number => $rounded";
}
foreach my $number (@numbers) {
$number += 100;
my $rounded = sprintf '%.2f', $number;
say "$number => $rounded";
}
Это выводит:
0.254 => 0.25
0.255 => 0.26
0.256 => 0.26
100.254 => 100.25
100.255 => 100.25
100.256 => 100.26
Для меня очень странно, что Perl несовместим с округлением. Я ожидаю, что оба числа, заканчивающиеся на .255, будут округлены до .26 Это верно для 0.255, но это неверно для числа 100.255.
Вот цитата из Perl Cookbook, http://docstore.mik.ua/orelly/perl/cookbook/ch02_04.htm,
спринтф. Формат f позволяет вам указать определенное количество десятичных знаков для округления его аргумента. Perl смотрит на следующую цифру, округляет ее, если она больше 5, и округляет в противном случае.
Но я не вижу никаких доказательств того, что это правильно в http://perldoc.perl.org/functions/sprintf.html
Это ошибка в sprintf или Perl Cookbook не так? Если это желаемое поведение, почему это работает таким образом?