Perl에서는 소수점 이후의 장소 수를 어떻게 제한 할 수 있지만 후행 0은 없습니까?
-
05-09-2019 - |
문제
이 질문은 비슷합니다 "플로트에서 '.0'을 떨어 뜨립니다.", 그러나 소수점 후에는 Perl과 최대 숫자 수를 갖는다.
숫자를 문자열 형식으로 변환하여 소수점 직후가 아니라 중복 '0'을 삭제하는 방법을 찾고 있습니다. 그리고 여전히 최대의 디지털 수를 가지고 있습니다.
입력 데이터는 플로트입니다. 원하는 출력 :
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
"평가"와 결합 된 "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