Perl에서 부동 소수점 숫자를 어떻게 반올림합니까? 가장 가까운 정수로 반올림하는 방법은

소수 (부동 소수점)를 가장 가까운 정수로 반올림하는 방법은 무엇입니까?

예 :

1.2 = 1
1.7 = 2



답변

출력 perldoc -q round

Perl에 round () 함수가 있습니까? ceil ()과 floor ()는 어떻습니까? 삼각 함수?

int()향해 잘립니다 0. 특정 자릿수로 반올림 sprintf()하거나 printf()보통 가장 쉬운 경로입니다.

    printf("%.3f", 3.1415926535);       # prints 3.142

POSIX모듈 (표준 펄 분포의 일부)을 구현
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 분포의 일부인 모듈이 삼각 함수를 구현합니다. 내부적으로 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을 비난하지 마십시오. IEEE와 마찬가지로 C도 마찬가지다. 절대 값이 2**31(32 비트 시스템에서) 정수인 펄 숫자는 수학 정수와 매우 유사하게 작동합니다. 다른 번호는 보장되지 않습니다.


답변

보다 일반적인 (사소한) 유스 케이스의 경우 중간 표시 등에 대한 복잡한 답변에 동의하지 않는 경우 :

my $rounded = int($float + 0.5);

최신 정보

$float음수가 될 수 있으면 다음과 같은 변형으로 올바른 결과를 얻을 수 있습니다.

my $rounded = int($float + $float/abs($float*2 || 1));

이 계산으로 -1.4는 -1로 반올림되고 -1.6은 -2로 반올림되며 0은 폭발하지 않습니다.


답변

Math :: Round 와 같은 모듈을 사용할 수 있습니다 .

use Math::Round;
my $rounded = round( $float );

또는 당신은 그것을 거친 방법으로 할 수 있습니다 :

my $rounded = sprintf "%.0f", $float;


답변

printf 또는 sprintf를 사용하기로 결정한 경우 반올림을 짝수로 사용합니다.

foreach my $i ( 0.5, 1.5, 2.5, 3.5 ) {
    printf "$i -> %.0f\n", $i;
}
__END__
0.5 -> 0
1.5 -> 2
2.5 -> 2
3.5 -> 4


답변

perldoc / perlfaq 참조 :

그 기억 int()단지 숫자의 특정 번호로 라운딩 0으로 절단, sprintf()또는 printf()일반적으로 가장 쉬운 방법입니다.

 printf("%.3f",3.1415926535);
 # prints 3.142

POSIX모듈 (표준 펄 분포의 일부)을 구현 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 분포의 일부)> 삼각 함수를 구현합니다.

내부적으로 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을 비난하지 마십시오. IEEE와 마찬가지로 C도 마찬가지다. 절대 값이 2 ** 31 (32 비트 시스템) 미만의 정수인 Perl 숫자는 수학 정수와 매우 유사하게 작동합니다. 다른 번호는 보장되지 않습니다.


답변

외부 모듈이 필요하지 않습니다.

$x[0] = 1.2;
$x[1] = 1.7;

foreach (@x){
  print $_.' = '.( ( ($_-int($_))<0.5) ? int($_) : int($_)+1 );
  print "\n";
}

나는 당신의 요점을 놓칠 수도 있지만, 이것이 같은 일을하는 것이 훨씬 깔끔한 방법이라고 생각했습니다.

이것이하는 일은 요소의 모든 양수를 살펴보고 언급 한 형식으로 숫자와 반올림 된 정수를 인쇄하는 것입니다. 이 코드는 소수를 기준으로 한 반올림 된 양의 정수를 연결합니다. int ($ _)는 기본적으로 숫자를 내림 하므로 ($ -int ($ ))는 소수를 캡처합니다. 소수가 (정의 적으로) 엄격하게 0.5보다 작 으면 숫자를 내림하십시오. 그렇지 않은 경우 1을 추가하여 반올림하십시오.


답변

다음은 양수 또는 음수를 주어진 소수 자릿수로 반올림합니다.

sub round ()
{
    my ($x, $pow10) = @_;
    my $a = 10 ** $pow10;

    return (int($x / $a + (($x < 0) ? -0.5 : 0.5)) * $a);
}