Как можно округлить элементы в массиве Perl до двух десятичных знаков? - PullRequest
0 голосов
/ 22 октября 2010

У меня есть массив с несколькими элементами:

MSN = 34,3433423432434%

Chrome = 12,4343434353534%

Gtalk = 32,23233543543532% ...

И я передаю этот массив как метки оси Y для использования с модулем с именем GD :: Graph . Проблема, с которой я сталкиваюсь сейчас, заключается в том, что числа на графике настолько велики, что перекрываются с соседней записью и делают ее нечитаемой.

Есть ли способ, где я могу округлить ВСЕ элементы в массиве до 2 десятичных знаков? И сделать это xx.xx%?

Кроме того, кто-нибудь знаком с использованием GD :: Graph, вы знаете, как я могу увеличить размер текста на графике? Я могу увеличить размер заголовка / легенды, но фактический текст, как в 'Gtalk' или '32 .23233543543532% ', действительно маленький, и я пробовал много команд из http://search.cpan.org/dist/GDGraph/Graph.pm,, но, похоже, они не работа для меня!

Ответы [ 3 ]

10 голосов
/ 22 октября 2010

От 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-битных машинах), будут работать почти как математические целые числа. Другие номера не гарантируются.

4 голосов
/ 22 октября 2010
#!/usr/bin/perl

use strict; use warnings;
use YAML;

my %x = (
    MSN => '34.3433423432434%',
    Chrome => '12.4343434353534%',
    Gtalk => '32.23233543543532%',
);

for my $x ( values %x ) {
    $x =~ s/^(\d+\.\d+)%\z/ sprintf '%.2f%%', $1/e;
}

print Dump \%x;

Вывод:

Chrome: 12.43%
Gtalk: 32.23%
MSN: 34.34%

Если вы хотите извлечь значения в определенном порядке, используйте фрагмент хеша:

print "@x{ qw( MSN Chrome Gtalk ) }\n";

или, если вы просто хотите ключи изначения для выравнивания в вызове plot:

my $gd = $graph->plot([
    [ keys %x ],
    [ @x{ keys %x } ],
]) or die $graph->error;

Примечание. Чтобы увеличить размер текста на GD::Graph, используйте больший шрифт для элемента.См. Методы для диаграмм с осями .

Используя GD::Graph, вам действительно не нужно изменять значения самостоятельно.Просто укажите строку '.2f%%' в качестве аргумента y_number_format.

0 голосов
/ 31 мая 2015

http://search.cpan.org/dist/Math-Round/Round.pm

Math :: Round также творит чудеса.Вы можете передать его скаляр или список.

...