n Sig Figs로 반올림


20

도전

숫자 x와 숫자가 주어지면 n숫자 xn유효 숫자로 반올림 하고 결과를 출력하십시오.

중요한 인물

숫자의 유효 숫자는 측정 분해능에 영향을주는 숫자입니다. 여기에는 선행 0을 제외한 모든 숫자가 포함 됩니다.

소수점 뒤의 선행 0은 여전히 중요하지 않음 을 명심하십시오 .

숫자를 반올림 할 때 다음 숫자가 5보다 크거나 같은 경우 0에서 반올림해야합니다.

소수점 뒤의 모든 후행 0은 유효로 계산됩니다.

입력

첫 번째 숫자는 x반올림 할 숫자입니다. 두 번째 숫자는 n반올림해야하는 유효 숫자의 수입니다 x.

x-1,000,000,000에서 1,000, 000,000 사이의 숫자 (코드는 정수와 부동 소수점을 모두 처리해야 함)입니다. n1에서 50 사이의 양의 정수입니다. n의 자리 수보다 크지 않습니다 x.

입력은 절대 0또는 형식 이 아닙니다 ( 0예 : 0.000또는) 000.

Inputs: 2.6754, 2
Output: 2.7

2.7000소수점 뒤의 후행 0이 유효 숫자로 계산되므로 출력이 유효하지 않습니다.


Inputs: 0.00034551, 4
Output: 0.0003455

Inputs: 50237.1238, 3
Output: 50200

소수점이 없어야합니다.


Inputs: 2374905, 1
Output: 2000000

Inputs: 543.0489, 4
Output: 543.0

Inputs: 15, 1
Output: 20

Inputs: 520.3, 3
Output: 520

원하는 경우 520.대신 출력 할 수는 없습니다 520.0.


Inputs: -53.87, 2
Output: -54

Inputs: 0.0999, 2
Output: 0.10

규칙

숫자를 n유효 숫자 로 반올림 할 수있는 내장 함수 및 라이브러리 는 허용되지 않습니다.

승리

바이트 단위의 가장 짧은 코드가 이깁니다.


4
의 경우 Inputs: 520.3, 3답변의 소수점이 520.중요하지 않습니까?
Greg Martin

5
@GregMartin 나는 그것이 3 시그 무화과 대 2
Suever

3
@BetaDecay 아니에요. 소수점이 필요합니다.
mbomb007

3
"(200)는 하나의 유효 숫자 것으로 간주됩니다" - chemistry.bd.psu.edu/jircitano/sigfigs.html을
mbomb007

4
@DLosc 그렇기 때문에 그 결과가 실제로 2.0 x 10^22 sigfigs를 나타내는로 쓰게됩니다.
mbomb007

답변:


3

파이썬 3, 83 바이트

(PHP 답변과 유사)

from math import *
def s(x,n):
 y=10**(ceil(log10(abs(x)))-n)
 return y*round(x/y)

테스트 사례 :

tests = [(2.6754,2), (0.00034551, 4), (50237.1238, 3),
        (2374905, 1), (543.0489, 4), (15, 1), (520.3, 3), (-53.87, 2)]

print ([s(x,n) for x,n in tests])

산출:

[2.7, 0.0003455, 50200, 2000000, 543.0, 20, 520, -54]

조금 더 길어진 것 외에도 다른 접근법은 다음과 같습니다.

from math import *
def s(x,n):
 z=ceil(log10(abs(x)))
 return "%.*f"%(n-z,10**z*round(x/10**z,n))

... (15, 1)의 입력에 대해 잘못된 출력을 생성합니다.

['2.7', '0.0003455', '50200', '2000000', '543.0', '10', '520', '-54']

... round()함수의 부동 소수점 부정확성으로 인해 . 내가 충분히 열심히 보았을 때도 "소수점에서 반올림"방법을 어기는 테스트 사례를 찾을 수있을 것 같습니다.

따라서 내 솔루션이 모든 경우에 100 % 정확하지는 않지만 10 진수로 계산되지 않으면 그렇지 않을 것 같습니다. 따라서이 문제는 FP 산술을 사용하는 모든 언어의 솔루션에 영향을 줄 수 있습니다.


본문을 s같은 줄에 놓고 세미콜론을 사용하여 바이트를 절약 하십시오. def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
Cyoce

또한 공간을 제거하여 공간 import *을 만들 수 있습니다import*
Cyoce

규칙에 따르면 "내장 함수 및 라이브러리를 사용하여 숫자를 n 자릿수로 반올림 할 수 없습니다." 그리고 당신은 n = 0 인 round 함수를 사용합니다
RosLuP

@RosLuP :이 round()함수 nn유효 숫자가 아닌 소수점 이하 자릿수로 반올림 되므로이 골프 이벤트에 허용되었습니다.
Simon

5

PHP, 130 바이트

<?=number_format($r=round($i=$argv[1],($n=$argv[2])-ceil(log(abs($i),10))),($d=(1+floor(log(abs($r),10))-$n))<0?abs($d):0,".","");

PHP, 133 바이트는 중요한 수치의 경우 <1 값으로 작동합니다.

<?=number_format($r=round($i=$argv[1],($n=$argv[2])-floor(log(abs($i),10))-1),($d=(1+floor(log(abs($r),10))-$n))<0?abs($d):0,".","");

PHP, 56 바이트는 작동하지만 불필요한 제로 건너 뛰기

<?=round($i=$argv[1],$argv[2]-floor(log(abs($i),10))-1);

PHP에서 라운드 함수를 도난 당했거나 삭제했습니다! 도전을 더 재미있게 만듭니다. 127 바이트

<?=ceil($x=($i=$argv[1])*10**(($r=$argv[2])-($l=floor(log(abs($i),10))+1)))-$x<=0.5?ceil($x)*10**($l-$r):floor($x)*10**($l-$r);

불필요한 제로도 건너 뜁니다. 농담을 위해서만 PHP에서 원시 함수를 사용하지 않는 버전입니다. 내가 선호하는 56 바이트 버전에 속하는
요 르그 Hülsermann

라이브러리 라운드를 사용하지 않으면 괜찮습니다 ....
RosLuP

3

배치, 660 652 바이트

@echo off
set m=%1.
set s=
if %m:~,1%==- set s=-&set m=%m:~1%
:m
if %m:~,1%==0 set m=%m:~1%&goto m
set d=%m:.=%
:d
if %d:~,1%==0 set d=%d:~1%&goto d
for /l %%i in (1,1,%2) do call set d=%%d%%0
call set r=%%d:~%2,1%%
call set d=%%d:~,%2%%
if %r% leq 4 goto r
set r=
:i
set/ai=1+%d:~-1%
set r=%i:~-1%%r%
set d=%d:~,-1%
if %i% leq 9 set d=%d%%r%&goto r
if not "%d%"=="" goto i
set d=1%r:~1%
set m=1%m%
set m=%m:1.0=.%
:r
if %m:~,2%==.0 set m=%m:.0=.%&set d=0%d%&goto r
set i=0
set p=.
:l
if %m:~,1%==. echo %s%%i%%p%%d%&exit/b
if %i%==0 set i=
if "%d%"=="" set d=0&set p=
set i=%i%%d:~,1%
set d=%d:~1%
set m=%m:~1%
goto l

설명 : .매개 변수에 a 가없는 경우 접미사로 시작한 다음 부호 (저장된) 및 선행 0을 자릅니다. 결과 변수 m는 원하는 결과 크기를 알려주기 때문에 나중에 저장됩니다. .그런 다음 모든 을 제거하여 추가 0을 초래할 수 있으므로 제거됩니다. n반올림하기에 충분한 숫자가 있는지 확인하기 위해 0이 접미사로 지정된 다음 nth 및 첫 번째 n숫자가 추출됩니다. 는 IF n일 자리가없는 4 미만이다 우리는 지루하게 추가 1문자열에. 문자열이 다음 오버 플로우 경우 우리는 접두어로 크기를 증가 1하지만, 원래보다 작 있다면 0.1우리는 제거하여 그렇게 1우리가 방금 추가하고 또한0소수점 뒤. 크기가 여전히 작은 경우 1소수점 이하의 0을 결과에 복사하지만, 그 1이상이면 답의 정수 부분을 추출하여 소수점에 도달하는 데 필요한 경우 0을 추가합니다. 정밀도가 잘못 표시되어 삭제되었습니다). 마지막으로 부호, 정수 부분, 소수점 및 소수점 부분이 연결됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.