Làm tròn đến n Sig Figs


20

Thử thách

Cho một số xvà một số n, làm tròn số xcho các nsố liệu quan trọng và đưa ra kết quả.

Con số đáng kể

Các số liệu có ý nghĩa của một số là các chữ số có ý nghĩa góp phần vào độ phân giải đo lường của nó. Điều này bao gồm tất cả các số trừ số 0 hàng đầu.

Hãy nhớ rằng các số 0 đứng đầu sau một dấu thập phân vẫn là những con số không đáng kể .

Khi làm tròn một chữ số, bạn phải làm tròn từ 0 nếu chữ số sau lớn hơn hoặc bằng năm.

Tất cả các số 0 ở sau dấu thập phân được tính là đáng kể.

Đầu vào

Số đầu tiên sẽ là x, số được làm tròn. Số thứ hai sẽ là n, số lượng các số liệu quan trọng bạn nên làm tròn x.

xsẽ là một số (mã của bạn sẽ xử lý cả số nguyên và dấu phẩy động) trong khoảng -1.000.000.000 đến 1.000, 000.000. nsẽ là một số nguyên dương trong khoảng từ 1 đến 50. nsẽ không bao giờ lớn hơn nunber của các chữ số trong x.

Đầu vào sẽ không bao giờ 0hoặc bất kỳ hình thức nào 0, ví dụ 0.000hoặc 000.

Ví dụ

Inputs: 2.6754, 2
Output: 2.7

Một đầu ra của 2.7000sẽ không hợp lệ vì các số 0 ở sau dấu thập phân được tính là các số liệu có ý nghĩa.


Inputs: 0.00034551, 4
Output: 0.0003455

Inputs: 50237.1238, 3
Output: 50200

Lưu ý rằng điều này không được có dấu thập phân.


Inputs: 2374905, 1
Output: 2000000

Inputs: 543.0489, 4
Output: 543.0

Inputs: 15, 1
Output: 20

Inputs: 520.3, 3
Output: 520

Nếu bạn muốn, bạn có thể đầu ra 520.thay thế nhưng không 520.0.


Inputs: -53.87, 2
Output: -54

Inputs: 0.0999, 2
Output: 0.10

Quy tắc

Các hàm và thư viện tích hợp cho phép bạn làm tròn số đến các nsố liệu quan trọng không được phép.

Chiến thắng

Mã ngắn nhất tính bằng byte thắng.


4
Đối với Inputs: 520.3, 3, không phải là dấu thập phân trong câu trả lời 520.quan trọng?
Greg Martin

5
@GregMartin Tôi tin rằng, đó là điều duy nhất khiến nó có 3 sig
figs

3
@BetaDecay Không, không phải vậy. Dấu thập phân sẽ được yêu cầu cho điều đó.
mbomb007

3
"200 được coi là có chỉ ONE con số đáng kể" - chemistry.bd.psu.edu/jircitano/sigfigs.html
mbomb007

4
@DLosc Đó là lý do tại sao nếu đó là kết quả bạn thực sự viết nó như là 2.0 x 10^2, hiển thị 2 sigfigs.
mbomb007

Câu trả lời:


3

Python 3, 83 byte

(tương tự như câu trả lời của PHP)

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

Các trường hợp thử nghiệm:

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])

Đầu ra:

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

Ngoài việc dài hơn một chút, một cách tiếp cận khác mà tôi đã xem xét:

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

... Tạo đầu ra không chính xác cho đầu vào của (15, 1):

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

... Do sự thiếu chính xác của dấu phẩy động trong round()hàm. Dường như với tôi rằng tôi có thể tìm thấy các trường hợp thử nghiệm sẽ phá vỡ phương pháp "làm tròn đến số thập phân không" nếu tôi nhìn đủ cứng.

Do đó, dường như đối với tôi, giải pháp của tôi có thể không đúng 100% cho tất cả các trường hợp và sẽ không được trừ khi nó được tính theo số thập phân. Do đó, vấn đề này có thể ảnh hưởng đến các giải pháp trong bất kỳ ngôn ngữ nào sử dụng số học FP.


Lưu một số byte bằng cách đặt phần thân strên cùng một dòng, sau đó sử dụng dấu chấm phẩy. def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
Cyoce

Ngoài ra, bạn có thể xóa khoảng trống import *để tạo nóimport*
Cyoce

câu trả lời của bạn cho tôi là không ổn vì các quy tắc nói: "Các hàm và thư viện tích hợp cho phép bạn làm tròn một số đến n số liệu quan trọng không được phép." Và bạn sử dụng hàm tròn với n = 0
RosLuP

@RosLuP: round()Hàm làm tròn đến nvị trí thập phân, không đến các nsố liệu quan trọng, vì vậy nó được phép cho sự kiện golf này.
Simon

5

PHP, 130 byte

<?=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 Byte hoạt động với các giá trị <1 cho các số liệu quan trọng

<?=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 Byte hoạt động nhưng bỏ qua Zeros không cần thiết

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

Ai đó đã đánh cắp hoặc xóa hàm tròn trong PHP! Để làm cho thử thách thú vị hơn. 127 byte

<?=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);

Nó bỏ qua Zeros đơn nhất quá. Đây là một phiên bản mà tôi sử dụng không phải là hàm tròn gốc trong PHP chỉ để nói đùa. Nó thuộc về Phiên bản 56 Byte mà tôi thích
Jörg Hülsermann

Ok nếu không sử dụng vòng thư viện ....
RosLuP

3

Hàng loạt, 660 652 byte

@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

Giải thích: Bắt đầu bằng cách thêm một .tham số trong trường hợp nó chưa có sẵn, sau đó cắt bỏ dấu (được lưu) và bất kỳ số 0 đứng đầu nào. Biến kết quả mđược lưu lại sau này vì nó sẽ cho chúng ta biết mức độ mong muốn của kết quả. Bất kỳ .s nào sau đó được loại bỏ, điều này có thể dẫn đến các số 0 đứng đầu, do đó chúng cũng bị xóa. ncác số không được thêm vào để đảm bảo có đủ các chữ số để làm tròn, sau đó các chữ số nthứ nhất và thứ nhất nđược trích xuất. Nếu nchữ số thứ 4 không phải là 4 hoặc ít hơn thì chúng ta sẽ thêm 1vào chuỗi. Nếu chuỗi tràn thì chúng ta tăng cường độ bằng cách thêm tiền tố a 1, nhưng nếu ban đầu nó nhỏ hơn 0.1chúng ta làm điều đó bằng cách loại bỏ 1chúng ta vừa thêm và cũng là một0sau dấu thập phân. Nếu cường độ vẫn nhỏ hơn 1thì chúng ta sao chép các số 0 sau dấu thập phân vào kết quả, tuy nhiên nếu nó là 1hoặc nhiều hơn thì chúng ta trích xuất phần nguyên của câu trả lời, thêm các số 0 nếu cần để đạt đến dấu thập phân (sau đó là số thập phân xóa vì nó sẽ hiển thị độ chính xác không chính xác). Cuối cùng, dấu, phần nguyên, dấu thập phân và phần thập phân được nối với nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.