-2

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

MSN = 34.3433423432434%

铬 = 12.4343434353534%

Gtalk = 32.23233543543532% ...

我将这个数组作为 y 轴标签传递给一个名为GD::Graph的模块。我现在面临的问题是图表上的数字太大以至于它们与相邻条目重叠并使其不可读。

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

另外,任何熟悉使用 GD::Graph 的人,你知道如何增加图表上的文本大小吗?我可以很好地增加标题/图例的大小,但是“Gtalk”或“32.23233543543532%”中的实际文本非常小,我已经尝试了很多来自http://search.cpan.org/dist/GDGraph的命令/Graph.pm,但它们似乎对我不起作用!

4

3 回答 3

10

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

Don't blame Perl. It's the same as in C. IEEE says we have to do this. Perl numbers whose absolute values are integers under 2**31 (on 32 bit machines) will work pretty much like mathematical integers. Other numbers are not guaranteed.

于 2010-10-21T21:39:51.457 回答
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;

输出:

铬:12.43%
Gtalk:32.23%
微软:34.34%

如果要按特定顺序提取值,请使用哈希切片:

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

或者,如果您只希望键和值在plot调用中排列:

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

注意:要增加 a 上的文本大小GD::Graph,请为元素使用更大的字体。请参阅带有轴的图表的方法

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

于 2010-10-21T21:26:36.053 回答
0

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

Math::Round also works wonders. You can pass it a scalar or a list.

于 2015-05-31T14:53:07.657 回答