Perl에서는 소수점 이후의 장소 수를 어떻게 제한 할 수 있지만 후행 0은 없습니까?

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

  •  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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top