소수 (부동 소수점)를 가장 가까운 정수로 반올림하는 방법은 무엇입니까?
예 :
1.2 = 1
1.7 = 2
답변
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);
}