如何将Perl数组中的元素四舍五入到只有两位小数?

时间:2010-10-21 21:18:52

标签: perl rounding labels gd-graph

我有一个包含几个元素的数组:

  

MSN = 34.3433423432434%

     

Chrome = 12.4343434353534%

     

Gtalk = 32.23233543543532%   ...

我将此数组作为y轴标签传递,以与名为GD::Graph的模块一起使用。我现在面临的问题是,图表上的数字是如此之大,以至于它们与相邻条目重叠并使其无法读取。

有没有办法可以将数组中的所有元素四舍五入到小数点后两位?并将其设为xx.xx%?

<子> 此外,任何熟悉使用GD :: Graph的人,您知道如何增加图表上的文字大小吗?我可以很好地增加标题/图例大小,但是'Gtalk'或'32 .23233543543532%'中的实际文本非常小,我尝试了很多来自http://search.cpan.org/dist/GDGraph/Graph.pm的命令,但它们似乎没有为我工作! 功能

3 个答案:

答案 0 :(得分:10)

perlfaq4回答Does Perl have a round() function? What about ceil() and floor()? Trig functions?


请记住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表示我们必须这样做。绝对值为2 ** 31(在32位机器上)的整数的Perl数将与数学整数非常相似。其他数字不保证。

答案 1 :(得分:4)

#!/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的文字大小,请为元素使用更大的字体。请参阅Methods for charts with axes

使用GD::Graph,您真的不必自己修改值。只需提供字符串'.2f%%'作为y_number_format的参数。

答案 2 :(得分:0)

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

Math :: Round也有奇效。您可以将其传递给标量或列表。