Bulat ke n Sig Gambar

20

Tantangan

Diberi angka xdan angka n, angka bulat xhingga nangka signifikan dan hasilkan hasilnya.

Sosok penting

Angka signifikan dari angka adalah digit yang membawa makna yang berkontribusi pada resolusi pengukurannya. Ini termasuk semua angka kecuali angka nol di depan.

Ingatlah bahwa memimpin nol setelah titik desimal masih merupakan angka yang tidak signifikan .

Saat membulatkan angka, Anda harus membulatkan dari nol jika angka berikut lebih besar atau sama dengan lima.

Semua nol yang tertinggal setelah titik desimal dihitung sebagai signifikan.

Memasukkan

Angka pertama adalah x, angka yang akan dibulatkan. Angka kedua adalah n, jumlah angka penting yang harus dibulatkan x.

xakan berupa angka (kode Anda harus menangani bilangan bulat dan titik mengambang) antara -1.000.000.000 dan 1.000.000.000 inklusif. nakan menjadi bilangan bulat positif antara 1 dan 50 inklusif. ntidak akan pernah lebih besar dari angka digit dalam x.

Input tidak akan pernah 0atau dalam bentuk apa pun 0, misalnya 0.000atau 000.

Contohnya

Inputs: 2.6754, 2
Output: 2.7

Output 2.7000akan tidak valid karena trailing nol setelah titik desimal dihitung sebagai angka signifikan.


Inputs: 0.00034551, 4
Output: 0.0003455

Inputs: 50237.1238, 3
Output: 50200

Perhatikan bahwa ini tidak boleh memiliki titik desimal.


Inputs: 2374905, 1
Output: 2000000

Inputs: 543.0489, 4
Output: 543.0

Inputs: 15, 1
Output: 20

Inputs: 520.3, 3
Output: 520

Jika Anda mau, Anda bisa output 520.saja tetapi tidak 520.0.


Inputs: -53.87, 2
Output: -54

Inputs: 0.0999, 2
Output: 0.10

Aturan

Fungsi dan pustaka built-in yang memungkinkan Anda untuk membulatkan angka ke nangka-angka penting dilarang.

Kemenangan

Kode terpendek dalam byte menang.

Peluruhan Beta
sumber
4
Karena Inputs: 520.3, 3, bukankah angka desimal dalam jawaban itu 520.penting?
Greg Martin
5
@GregMartin Saya percaya itu adalah, karena hanya itulah satu-satunya yang membuatnya memiliki 3 buah ara vs 2
Suever
3
@ BetaDecay Tidak bukan. Titik desimal akan diperlukan untuk itu.
mbomb007
3
"200 dianggap hanya memiliki SATU angka penting" - chemistry.bd.psu.edu/jircitano/sigfigs.html
mbomb007
4
@Dlikosc Itu sebabnya jika itu adalah hasil yang Anda akan benar-benar menulisnya 2.0 x 10^2, menunjukkan 2 sigfigs.
mbomb007

Jawaban:

3

Python 3, 83 byte

(mirip dengan jawaban PHP)

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

Kasus uji:

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

Keluaran:

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

Selain sedikit lebih lama, pendekatan lain yang saya pertimbangkan:

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

... menghasilkan output yang salah untuk input (15, 1):

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

... karena ketidaktepatan floating point dalam round()fungsi. Tampaknya bagi saya bahwa saya dapat menemukan kasus uji yang akan memecahkan metode "putaran ke nol desimal" juga jika saya terlihat cukup keras.

Jadi, bagi saya tampaknya solusi saya mungkin tidak 100% benar untuk semua kasus dan tidak akan kecuali jika dihitung dalam desimal. Karena itu masalah ini dapat memengaruhi solusi dalam bahasa apa pun yang menggunakan aritmatika FP.

Simon
sumber
Simpan beberapa byte dengan meletakkan tubuh spada baris yang sama, lalu gunakan titik koma. def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
Cyoce
Anda juga dapat menghapus ruang import *untuk membuatnyaimport*
Cyoce
jawaban Anda untuk saya tidak apa-apa karena aturannya mengatakan: "Fungsi dan perpustakaan bawaan yang memungkinkan Anda untuk membulatkan angka ke angka n signifikan tidak diizinkan." Dan Anda menggunakan fungsi bulat dengan n = 0
RosLuP
@RosLuP: round()Fungsi membulatkan ke ntempat desimal, bukan ke nangka signifikan, sehingga diizinkan untuk acara golf ini.
Simon
5

PHP, 130 Bytes

<?=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 Bytes bekerja dengan nilai <1 untuk angka signifikan

<?=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 Bytes berfungsi tetapi lewati angka nol yang tidak perlu

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

Seseorang telah mencuri atau menghapus fungsi bundar di PHP! Untuk membuat tantangan lebih menarik. 127 Bytes

<?=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);
Jörg Hülsermann
sumber
Itu juga melompati Zero yang tidak sehat. Ini adalah versi di mana saya menggunakan bukan fungsi putaran asli di PHP hanya untuk lelucon. Itu milik 56 Byte Version yang saya lebih suka
Jörg Hülsermann
OK jika tidak menggunakan putaran perpustakaan ....
RosLuP
3

Batch, 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

Penjelasan: Mulai dengan suffixing .ke parameter seandainya belum memilikinya, kemudian potong tanda (yang disimpan) dan nol di depan. Variabel yang dihasilkan mdisimpan untuk nanti karena akan memberi tahu kami besarnya hasil yang diinginkan. Apa .pun kemudian dihapus, yang bisa menghasilkan angka nol lebih lanjut, sehingga mereka juga dihapus. nnol adalah suffix untuk memastikan bahwa ada cukup digit untuk dibulatkan, lalu digit ke-1 ndan pertama ndiekstraksi. Jika ndigit ke-4 atau kurang dari itu maka kita dengan susah payah menambah 1string. Jika string meluap maka kita meningkatkan besarnya dengan awalan a 1, tetapi jika awalnya kurang dari 0.1kita melakukannya dengan menghapus 1kita baru saja menambahkan dan juga0setelah titik desimal. Jika besarnya masih kurang dari 1maka kita menyalin nol setelah titik desimal ke hasilnya, namun jika itu 1atau lebih maka kita mengekstrak bagian bilangan bulat dari jawaban, menambahkan nol tambahan jika perlu untuk mencapai titik desimal (yang kemudian dihapus karena akan menunjukkan presisi yang salah). Akhirnya tanda, bagian bilangan bulat, titik desimal dan bagian desimal disatukan.

Neil
sumber