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

如何将Perl数组中的元素四舍五入到小数点后两位?,perl,rounding,labels,gd-graph,Perl,Rounding,Labels,Gd Graph,我有一个包含几个元素的数组: MSN=34.343342344% 铬=12.433534% Gtalk=32.23233543543532% 我将这个数组作为y轴标签传递给一个名为的模块。我现在面临的问题是,图表上的数字太大,以至于它们与相邻的条目重叠,无法读取 是否有一种方法可以将数组中的所有元素四舍五入到小数点后2位?让它变成xx.xx% 另外,任何熟悉使用GD::Graph的人,您知道如何增加图形上的文本大小吗?我可以很好地增加标题/图例的大小,但“Gtalk”或“32.2323354

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

MSN=34.343342344%

铬=12.433534%

Gtalk=32.23233543543532%

我将这个数组作为y轴标签传递给一个名为的模块。我现在面临的问题是,图表上的数字太大,以至于它们与相邻的条目重叠,无法读取

是否有一种方法可以将数组中的所有元素四舍五入到小数点后2位?让它变成xx.xx%

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

输出:

Chrome: 12.43% Gtalk: 32.23% MSN: 34.34% 或者,如果您只希望键和值在
绘图中对齐,请调用:

my $gd = $graph->plot([
    [ keys %x ],
    [ @x{ keys %x } ],
]) or die $graph->error;
注意:要增加
GD::Graph
上的文本大小,请为元素使用较大的字体。看

使用
GD::Graph
,您真的不必自己修改这些值。只需提供字符串
'.2f%%'
作为
y\u number\u格式的参数

From的答案:


请记住,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
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以下整数的Perl数字(在32位机器上)的工作原理与数学整数非常相似。其他数字不保证。


数学:圆也能创造奇迹。你可以给它一个标量或一个列表。

这是两个不相关的问题,你应该单独问。下次我会记住这一点。StackOverflow新手!虽然这是一个令人惊奇的概念,但我希望我早一点就听说了。西南,谢谢你的回答,但我只是不想以一定的精度打印十进制。我想将数组中数字的值更改为xx.xx。原因是,我将整个数组传递给GD元素。我明白了吗?或者你想让我更好地解释。。。如果我感到困惑?:)@c0d3rs阵列中到底是什么?请注意,for
循环的
会修改数组的元素。我只是打印了每个元素以供说明。有两个数组,一个有{MSN,Chrome,GTalk..},另一个有相应的y值{34.34334233434343534,12.43434353534,32.232335435435}。我确实测试了你的代码,但它没有修改数组的元素。当你在一个数组中有键,在一个并行数组中有值时,你知道你应该使用散列。@c0d3rs我不知道你是如何测试代码的,但哦,是的,它确实测试了。
use POSIX;
$ceil   = ceil(3.5);   # 4
$floor  = floor(3.5);  # 3
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