Rund zu n Sig Abb

20

Herausforderung

Mit einer Zahl xund einer Zahl nrunden Sie die Zahl xauf nsignifikante Zahlen und geben das Ergebnis aus.

Bedeutende Zahlen

Die signifikanten Ziffern einer Zahl sind Ziffern, deren Bedeutung zur Messauflösung beiträgt. Dies schließt alle Zahlen mit Ausnahme der führenden Nullen ein.

Bedenken Sie, dass führende Nullen nach dem Komma immer noch unbedeutende Zahlen sind.

Wenn Sie eine Ziffer runden, müssen Sie von Null abrunden, wenn die folgende Ziffer größer oder gleich fünf ist.

Alle nachgestellten Nullen nach einem Dezimalpunkt werden als signifikant gezählt.

Eingang

Die erste Zahl xist die Zahl, die gerundet werden soll. Die zweite Zahl nist die Anzahl der signifikanten Stellen, auf die gerundet werden xsoll.

xwird eine Zahl sein (Ihr Code sollte sowohl Ganzzahlen als auch Gleitkommazahlen verarbeiten) zwischen -1.000.000.000 und 1.000.000.000 einschließlich. nwird eine positive ganze Zahl zwischen 1 und einschließlich 50 sein. nwird niemals größer sein als die Zahl der Ziffern in x.

Die Eingabe wird niemals 0oder irgendeine Form von 0zB 0.000oder sein 000.

Beispiele

Inputs: 2.6754, 2
Output: 2.7

Eine Ausgabe von 2.7000wäre ungültig, da die nachgestellten Nullen nach dem Komma als signifikante Ziffern gezählt werden.


Inputs: 0.00034551, 4
Output: 0.0003455

Inputs: 50237.1238, 3
Output: 50200

Beachten Sie, dass dies kein Dezimalzeichen sein darf.


Inputs: 2374905, 1
Output: 2000000

Inputs: 543.0489, 4
Output: 543.0

Inputs: 15, 1
Output: 20

Inputs: 520.3, 3
Output: 520

Wenn Sie möchten, können Sie 520.stattdessen aber nicht ausgeben 520.0.


Inputs: -53.87, 2
Output: -54

Inputs: 0.0999, 2
Output: 0.10

Regeln

Eingebaute Funktionen und Bibliotheken, mit denen Sie eine Zahl auf nsignifikante Zahlen runden können, sind nicht zulässig.

Gewinnen

Der kürzeste Code in Bytes gewinnt.

Beta-Zerfall
quelle
4
Denn Inputs: 520.3, 3ist der Dezimalpunkt in der Antwort nicht 520.entscheidend?
Greg Martin
5
@ GregMartin Ich glaube, dass es ist, wie das ist das einzige, was macht es 3 Sig Feigen vs. 2
Suever
3
@BetaDecay Nein, ist es nicht. Dafür wäre der Dezimalpunkt erforderlich.
mbomb007
3
"200 hat nur EINE signifikante Zahl" - chemistry.bd.psu.edu/jircitano/sigfigs.html
mbomb007
4
@DLosc Wenn dies das Ergebnis wäre, würden Sie es so schreiben 2.0 x 10^2, dass die 2 Sigfigs angezeigt werden.
mbomb007

Antworten:

3

Python 3, 83 Bytes

(ähnlich der PHP-Antwort)

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

Testfälle:

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

Ausgabe:

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

Abgesehen davon, dass es etwas länger ist, ein anderer Ansatz, den ich in Betracht gezogen habe:

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

... erzeugt eine falsche Ausgabe für die Eingabe von (15, 1):

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

... aufgrund von Gleitkommaungenauigkeiten in der round()Funktion. Es scheint mir wahrscheinlich, dass ich Testfälle finden könnte, die die Methode "Nachkommastellen runden" durchbrechen würden, auch wenn ich genau genug nachgesehen hätte.

Daher scheint es mir, dass meine Lösung wahrscheinlich nicht in allen Fällen 100% korrekt ist und es nicht wäre, wenn sie nicht in Dezimalzahlen berechnet worden wäre. Dieses Problem kann sich daher auf Lösungen in jeder Sprache auswirken, die FP-Arithmetik verwenden.

Simon
quelle
Speichern Sie einige Bytes, indem Sie den Body von sin dieselbe Zeile setzen und dann Semikolons verwenden. def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
Cyoce
Sie können auch das Leerzeichen entfernen import *, um es zu machenimport*
Cyoce
Ihre Antwort für mich ist nicht in Ordnung, weil die Regeln besagen: "Eingebaute Funktionen und Bibliotheken, mit denen Sie eine Zahl auf n signifikante Zahlen runden können, sind nicht zulässig." Und Sie verwenden die
Rundungsfunktion
@RosLuP: Die round()Funktion rundet auf nDezimalstellen, nicht auf nsignifikante Zahlen, daher war dies für dieses Golfereignis zulässig.
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 arbeitet mit Werten <1 für die signifikanten Zahlen

<?=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 funktioniert, aber unnötige Nullen überspringen

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

Jemand hat die Round-Funktion in PHP gestohlen oder gelöscht! Um die Herausforderung interessanter zu gestalten. 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
quelle
Es überspringt auch die unnötigen Nullen. Es ist eine Version, in der ich die native Round-Funktion in PHP nicht nur zum Spaß benutze. Es gehört zu der 56-Byte-Version, die ich bevorzugen würde
Jörg Hülsermann
Ok, wenn nicht Bibliothek Runde verwenden ....
RosLuP
3

Batch, 660 652 Bytes

@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

Erläuterung: Beginnt damit ., dem Parameter ein Suffix hinzuzufügen , falls noch keines vorhanden ist, und schneidet dann das gespeicherte Vorzeichen und alle führenden Nullen ab. Die resultierende Variable mwird für einen späteren Zeitpunkt gespeichert, da sie die gewünschte Größe des Ergebnisses angibt . Irgendwelche .s werden dann entfernt, was zu weiteren führenden Nullen führen könnte, so dass sie auch entfernt werden. nNullen werden angehängt, um sicherzustellen, dass genügend Stellen zum Runden vorhanden sind. Dann werden die nth- und die erste nStelle extrahiert. Wenn die nvierte Ziffer nicht 4 oder weniger ist 1, wird die Zeichenfolge mühsam ergänzt . Wenn die Zeichenkette überläuft, erhöhen wir die Größe, indem wir a voranstellen 1, aber wenn sie ursprünglich geringer war als 0.1wir, entfernen 1wir die soeben hinzugefügten und auch a0nach dem Komma. Wenn der Betrag immer noch kleiner als 1dann ist, kopieren wir die Nullen nach dem Dezimalpunkt in das Ergebnis. Wenn er jedoch 1größer oder gleich ist, extrahieren wir den ganzzahligen Teil der Antwort und fügen gegebenenfalls zusätzliche Nullen hinzu, um den Dezimalpunkt zu erreichen (der dann ist) gelöscht, da dies eine falsche Genauigkeit anzeigen würde). Schließlich werden das Vorzeichen, der ganzzahlige Teil, der Dezimalpunkt und der Dezimalteil verkettet.

Neil
quelle