От perlfaq4 ответа на Есть ли в Perl функция round ()? Что насчет ceil () и floor ()? Триг функции?
Помните, что int () просто усекается до 0. Для округления до определенного числа цифр sprintf () или printf () обычно является самым простым маршрутом.
printf("%.3f", 3.1415926535); # prints 3.142
Модуль POSIX (часть стандартного дистрибутива Perl) реализует ceil (), floor () и ряд других математических и тригонометрических функций.
use POSIX;
$ceil = ceil(3.5); # 4
$floor = floor(3.5); # 3
В 5.000 - 5.003 perls тригонометрия была выполнена в модуле Math :: Complex. В версии 5.004 модуль Math :: Trig (часть стандартного распределения Perl) реализует тригонометрические функции. Внутренне он использует модуль Math :: Complex, и некоторые функции могут вырваться из действительной оси в комплексную плоскость, например, обратный синус 2.
Округление в финансовых приложениях может иметь серьезные последствия, и используемый метод округления должен быть точно указан. В этих случаях, вероятно, стоит не верить тому, какое системное округление используется Perl, а вместо этого реализовать функцию округления, в которой вы нуждаетесь сами.
Чтобы понять почему, обратите внимание, что у вас все еще будет проблема при чередовании полпути:
for ($i = 0; $i < 1.01; $i += 0.05) { printf "%.1f ",$i}
0.0 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.4 0.5 0.5 0.6 0.7 0.7
0.8 0.8 0.9 0.9 1.0 1.0
Не вините Perl. Это так же, как в C. IEEE говорит, что мы должны это сделать. Числа Perl, абсолютные значения которых являются целыми числами меньше 2 ** 31 (на 32-битных машинах), будут работать почти как математические целые числа. Другие номера не гарантируются.