-2

私はいくつかの要素を持つ配列を持っています:

MSN = 34.3433423432434%

クロム = 12.4343434353534%

Gtalk = 32.23233543543532% ...

そして、この配列をGD::Graphというモジュールで使用する y 軸ラベルとして渡します。私が今直面している問題は、グラフの数字が大きすぎて、隣接するエントリと重なって読めなくなることです。

配列内のすべての要素を小数点以下 2 桁に丸める方法はありますか? そしてそれをxx.xx%にしますか?

また、GD::Graph の使用に慣れている人は、グラフのテキストサイズを大きくする方法を知っていますか? タイトル/凡例のサイズを大きくすることはできますが、「Gtalk」または「32.23233543543532%」のような実際のテキストは非常に小さく、http://search.cpan.org/dist/GDGraph から多くのコマンドを試しました。 /Graph.pmですが、私にはうまくいかないようです!

4

3 に答える 3

10

perlfaq4の回答からDoes Perl has a round() function?への回答 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 の perl では、三角法は 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 の数値は、数学的な整数とほとんど同じように機能します。他の数値は保証されません。

于 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;

出力:

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です。

于 2010-10-21T21:26:36.053 に答える
0

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

Math::Round も驚異的に機能します。スカラーまたはリストを渡すことができます。

于 2015-05-31T14:53:07.657 に答える