Perl配列内の要素を小数点以下の2つの場所に丸めるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3992035

質問

いくつかの要素を持つ配列があります:

MSN = 34.343423432434%

Chrome = 12.4343434353534%

gtalk = 32.23233543543532%...

そして、私はこの配列をy軸ラベルとして渡して、呼ばれるモジュールで使用します GD ::グラフ. 。私が今直面している問題は、グラフ上の数字が非常に大きいため、隣接するエントリと重複して読めないことです。

配列内のすべての要素をわずか2つの小数点に丸められる方法はありますか? xx.xx%にしますか?

また、gd :: graphを使用することに慣れている人は、グラフのテキストサイズを増やすにはどうすればよいですか?タイトル /レジェンドサイズを正常に増やすことができますが、「GTALK」または'32 .23233543543532%のような実際のテキストは本当に小さいので、からのコマンドをたくさん試しました http://search.cpan.org/dist/gdgraph/graph.pm, 、しかし、彼らは私のために働いていないようです!

役に立ちましたか?

解決

#!/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;

注:aのテキストサイズを増やすには GD::Graph, 、要素に大きなフォントを使用します。見る 軸を持つチャートの方法.

使用 GD::Graph, 、あなたは本当に自分で価値を変更する必要はありません。文字列を提供するだけです '.2f%%' の議論として y_number_format.

他のヒント

から perlfaq4の答え Perlにはラウンド()機能がありますか? 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分布の一部)が三角関数を実装します。内部的には、数学::複雑なモジュールを使用し、一部の関数は実際の軸から複雑な平面、たとえば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数値は、数学的整数とほとんど同じように機能します。他の数字は保証されていません。

http://search.cpan.org/dist/math-round/round.pm

数学::ラウンドも驚異的に機能します。スカラーまたはリストを渡すことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top