PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 78
Альтернативное решение — преобразовать числа в целые, умножая их на соответствующий коэффициент.
Комментарий
Процедура equal понадобилась из-за того, что в компьютерах многие числа с плавающей запятой представляются с ограниченной точностью. Дополнительная информация приведена в разделе «Введение».
При фиксированном количестве цифр в дробной части (например, в денежных суммах) проблему можно решить преобразованием в целое число. Если
2.3. Округление чисел с плавающей запятой 71
сумма 3.50 будет храниться в виде 350, а не 3.5, необходимость в числах с плавающей запятой отпадает. Десятичная точка снова появляется в выводимых данных:
Swage = 536, # $5 36/час
$week = 40 • Swage, в $214 40
printf( One week's wage is \$% 2f\n Sweek/100),
One week's wage is: $214.40
Редко требуется сравнивать числа более чем до 15 разряда.
> Смотри также---------------------------------------------------------------------------------------------
Описание функции sprintf вperifunc(\); описание переменной $# в странице руководства perlvariX); документация по стандартному модулю Math::BigFloat. Функция sprintf используется в рецепте 2.3. Также обращайтесь к разделу 4.2.2 тома 2 «Искусство программирования».
2.3. Округление чисел с плавающей запятой
Проблема
Число с плавающей запятой требуется округлить до определенного разряда. Проблема связана с теми же погрешностями представления, которые затрудняют сравнение чисел (см. рецепт 2.2), а также возникает в ситуациях, когда точность ответа намеренно снижается для получения более наглядного результата.
Решение
Для получения непосредственного вывода воспользуйтесь функциями Perl sprintf
или printf:
Srounded = sprintf( %FORMATf , Sun rounded),
Комментарий
Округление серьезно отражается на работе некоторых алгоритмов, потому используемый метод должен быть точно указан. В особо важных приложениях (например, в финансовых вычислениях или системах наведения ракет) грамотный программист реализует свою собственную функцию округления, не полагаясь на встроенную логику языка (или ее отсутствие).
