Perlでは、どのように私は小数点以下の桁数を制限するが、末尾のゼロを持つことはできませんか?
-
05-09-2019 - |
質問
この質問はhref="https://stackoverflow.com/questions/385325/dropping-trailing-0-from-floats">は「フロートから「0.0' を末尾に落とす」にしかし、Perl用と小数点以下の最大桁数を有する。
私は、任意の冗長を落とし、文字列形式に番号を変換する方法を探しています「0」だけではなく、右の小数点以下を含みます。そしてデジタルスチルの最大数と、例えば3
入力データはフロートです。所望の出力:
0 -> 0
0.1 -> 0.1
0.11 -> 0.11
0.111 -> 0.111
0.1111111 -> 0.111
解決
また、数学::ラウンドに使用することができますこれを行うには:
$ perl -MMath::Round=nearest -e 'print nearest(.001, 0.1), "\n"'
0.1
$ perl -MMath::Round=nearest -e 'print nearest(.001, 0.11111), "\n"'
0.111
他のヒント
直接、次を使用します
my $s = sprintf('%.3f', $f);
$s =~ s/\.?0*$//;
print $s
...またはより一般的にそれを行うためのサブルーチンを定義します:
sub fstr {
my ($value,$precision) = @_;
$precision ||= 3;
my $s = sprintf("%.${precision}f", $value);
$s =~ s/\.?0*$//;
$s
}
print fstr(0) . "\n";
print fstr(1) . "\n";
print fstr(1.1) . "\n";
print fstr(1.12) . "\n";
print fstr(1.123) . "\n";
print fstr(1.12345) . "\n";
print fstr(1.12345, 2) . "\n";
print fstr(1.12345, 10) . "\n";
プリントます:
0
1
1.1
1.12
1.123
1.123
1.12
1.12345
あなたは "evalの" と組み合わせて "はsprintf" を使用することができます。
my $num = eval sprintf('%.3f', $raw_num);
例
#!/usr/bin/perl
my @num_array = (
0, 1, 1.0, 0.1, 0.10, 0.11, 0.111, 0.1110, 0.1111111
);
for my $raw_num (@num_array) {
my $num = eval sprintf('%.3f', $raw_num);
print $num . "\n";
}
出力:
0
1
1
0.1
0.1
0.11
0.111
0.111
0.111
これは、あなたが探して出力が得られます。
sub dropTraillingZeros{
$_ = shift;
s/(\d*\.\d{3})(.*)/$1/;
s/(\d*\.\d)(00)/$1/;
s/(\d*\.\d{2})(0)/$1/;
print "$_\n";
}
dropTraillingZeros(0);
dropTraillingZeros(0.1);
dropTraillingZeros(0.11);
dropTraillingZeros(0.111);
dropTraillingZeros(0.11111111);
所属していません StackOverflow