Einige Dezimalzahlen können aufgrund der internen Darstellung der binären Gleitkommazahlen nicht genau als binäre Gleitkommazahlen dargestellt werden. Beispiel: Das Runden von 14.225 auf zwei Dezimalstellen führt nicht wie erwartet zu 14.23, sondern zu 14.22.
Python :
In: round(14.225, 2)
Out: 14.22
Angenommen, wir haben eine Zeichenfolgendarstellung von 14.225 als '14 .225 ', dann sollten wir in der Lage sein, unsere gewünschte Rundung '14 .23' als Zeichenfolgendarstellung zu erreichen.
Dieser Ansatz kann mit beliebiger Genauigkeit verallgemeinert werden.
Mögliche Python 2/3 Lösung
import sys
def round_string(string, precision):
assert(int(precision) >= 0)
float(string)
decimal_point = string.find('.')
if decimal_point == -1:
if precision == 0:
return string
return string + '.' + '0' * precision
all_decimals = string[decimal_point+1:]
nb_missing_decimals = precision - len(all_decimals)
if nb_missing_decimals >= 0:
if precision == 0:
return string[:decimal_point]
return string + '0' * nb_missing_decimals
if int(all_decimals[precision]) < 5:
if precision == 0:
return string[:decimal_point]
return string[:decimal_point+precision+1]
sign = '-' if string[0] == '-' else ''
integer_part = abs(int(string[:decimal_point]))
if precision == 0:
return sign + str(integer_part + 1)
decimals = str(int(all_decimals[:precision]) + 1)
nb_missing_decimals = precision - len(decimals)
if nb_missing_decimals >= 0:
return sign + str(integer_part) + '.' + '0' * nb_missing_decimals + decimals
return sign + str(integer_part + 1) + '.' + '0' * precision
Verwendung :
# No IEEE 754 format rounding
In: round_string('14.225',2)
Out: '14.23'
# Trailing zeros
In: round_string('123.4',5)
Out: '123.40000'
In: round_string('99.9',0)
Out: '100'
# Negative values
In: round_string('-99.9',0)
Out: '-100'
In: round_string('1',0)
Out: '1'
# No unnecessary decimal point
In: round_string('1.',0)
Out: '1'
# No unnecessary decimal point
In: round_string('1.0',0)
Out: '1'
In: for i in range(8):
print(round_string('123456789.987654321',i))
Out: 123456790
123456790.0
123456789.99
123456789.988
123456789.9877
123456789.98765
123456789.987654
123456789.9876543
Aufgabe
Eingabeargument 1 : Eine Zeichenfolge, die enthält
- mindestens eine Ziffer (
0
,1
,2
,3
,4
,5
,6
,7
,8
,9
), - höchstens ein Dezimalpunkt (
.
), dem mindestens eine Ziffer vorangestellt sein muss, - ein optionales Minuszeichen (
-
) als erstes Zeichen.
Eingabeargument 2 : eine nicht negative Ganzzahl
Ausgabe : Die korrekt gerundete Zeichenfolge (Basis 10)
Rundung = Runde halb weg von Null
Dies ist ein Code-Golf . Die niedrigste Anzahl von Bytes gewinnt!
round(A,B
5 Bytes0
ist keine positive Ganzzahl, sondern "nicht negativ".123.4 & 5 --> 123.40000
? Oder können wir davon ausgehen, dass die zweite Eingabe niemals größer sein wird als die Anzahl der Dezimalstellen nach dem Punkt in der ersten Eingabe?Antworten:
APL (Dyalog) , 4 Bytes
Dyalog APL verwendet genügend interne Präzision.
Probieren Sie es online aus!
⍎⍞
String-Eingabe ausführen⎕⍕
Holen Sie sich numerische Eingaben und verwenden Sie diese als Genauigkeit für die Formatierungquelle
Perl,
2220 BytesVerwenden von:
Es ist Dadas Version des Codes. Bisherige:
quelle
printf"%.*f",pop,pop
sollte funktionierenPHP,
3331 BytesPHP rundet auch richtig (mindestens auf 64 Bit):
Nimmt Eingaben von Befehlszeilenargumenten entgegen. Laufen Sie mit
-r
.PHP, keine eingebauten, 133 Bytes
Laufen Sie mit
-nr
oder testen Sie es online .Nervenzusammenbruch
Ein Null-Byte funktioniert nicht. also muss ich verwenden
substr
.quelle
"%.$argv[2]f"
stattdessen schreiben"%.{$argv[2]}f"
und dabei 2 Bytes sparen.Ruby 2.3, 12 + 45 = 57
Verwendet das
BigDecimal
eingebaute Gerät , muss jedoch vor dem Gebrauch benötigt werden, was als Flagge billiger ist.die Flagge:
-rbigdecimal
die Funktion:
Ruby 2.3 verwendet standardmäßig
ROUND_HALF_UP
quelle
Javascript (ES6), 44 Bytes
Probieren Sie es online aus:
quelle
Python,
114105103969189 Bytes5 Bytes dank Kevin Cruijssen
gespeichert 2 Bytes dank Krazor gespeichert
Probieren Sie es online aus!
quelle
from decimal import *
und das Entfernen der dreid.
ist 4 Bytes kürzer.d=Decimal
undd()
, was weitere 5 retten würde. (REXX, 24 Bytes
Da REXX immer die Textdarstellung von Zahlen verwendet, ist die korrekte Rundung von Zahlen kostenlos.
Probieren Sie es online aus!
quelle
BASH,
262321 BytesVerwendungszweck
Speichern Sie in round_string.sh, chmod + x round_string.sh
Bearbeiten: Bibliothek muss nicht geladen werden
quelle
14.22
für die Eingabe14.225 2
und nicht14.23
AHK, 25 Bytes
Ich bin wieder vereitelt von der Unfähigkeit von AHK, übergebene Parameter direkt in Funktionen zu verwenden, die entweder einen Variablennamen oder eine Zahl akzeptieren. Wenn ich ersetzen
a
mit1
derRound
Funktion, verwendet es den Wert1
. Wenn ich es versuche%1%
, wird versucht, den Inhalt des ersten Arguments als Variablennamen zu verwenden, was nicht funktioniert. Das Festlegen einer anderen Variablen kostete mich zuerst 6 Bytes.quelle
Stapel, 390 Bytes
Erläuterung. Beginnt gegebenenfalls mit dem Extrahieren des Zeichens. Teilt dann die Zahl in Ganzzahl- und Bruchziffern auf. Der Bruch wird mit
n+1
Nullen aufgefüllt, um sicherzustellen, dass er mehr alsn
Ziffern enthält. Dien
dritte (nullindizierte) Ziffer wird durch 5 geteilt, und dies ist der anfängliche Übertrag. Die Ganzzahl- undn
Bruchziffern werden verkettet und der Übertrag zeichenweise hinzugefügt. (Die zusätzlichen Nullen schützen vor Übertragswelligkeit.) Nachdem die Übertragswelligkeit aufhört, wird die Zahl rekonstruiert und ein Dezimalpunkt eingefügt.quelle
TI-Basic,
5316 BytesTI-Basic verwendet kein IEEE und die folgende Methode funktioniert für 0-9 (einschließlich) Dezimalstellen.
Vielen Dank an @JulianLachniet für den Nachweis, dass CE-Berechnungen den
toString(
Befehl haben, den ich nicht kannte (Color Edition-Berechnungen OS 5.2 oder höher sind erforderlich).PS Ich hatte eine zweite Zeile mit,
sub(Str1,1,N+inString(Str1,".
aber dann wurde mir klar, dass es nutzlos war.quelle
N
verwendet?Java 7,
777271 Bytes-1 Byte dank @cliffroot
72-Byte-Antwort:
Im Gegensatz zu Python, rundet Java bereits richtig und gibt bereits einen String wenn Sie
String.format("%.2f", aDouble)
mit dem2
mit der Menge an Dezimalstellen ersetzt Sie wollen.BEARBEITEN / HINWEIS: Ja, ich bin mir bewusst, dass
new Float(n)
1 Byte kürzer als istnew Double(n)
, aber anscheinend schlägt es für die Testfälle mit fehl123456789.987654321
. Siehe diesen Testcode bezüglich Double vs Float.Erläuterung:
Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
<T>T c(T n,int d){return(T)"".format("%."+d+"f",new Double(n+""));}
123456789.987654321, 4
sollte123456789.9877
nicht sein123456789.9876
Python (2/3), 394 Bytes
Funktioniert für Zahlen mit beliebiger Genauigkeit.
quelle
s[0]<'0'
die Zeichenfolgenmultiplikation verwenden und auch verwendenm='-'*(s[0]<'0')
. Zeilen ohne Blockanweisungsbereiche können mit;
(zo='';c=0
. B. ) zusammengefügt werden. Einigeif
Anweisungen könnten wahrscheinlich durch Listenindizierung ersetzt werden, um den Bedarf an Zeilenumbrüchen und Tabulatoren weiter zu verringern. Die letzte Zeile könnteo[::-1]
stattdessen ein Slice verwenden,reversed(o)
und das''.join
ist redundant. Möglicherweise können Sie es auch neu schreiben, um die Notwendigkeit mehrererreturn
Anweisungen zu vermeiden .JavaScript (ES6), 155 Byte
Erläuterung: Die Zeichenfolge wird zuerst so normalisiert, dass sie eine
.
und einen+1
Dezimalstelle enthält. Die nachfolgende Ziffer, alle vorhergehenden9
s oder.
s und jede vorhergehende Ziffer werden dann berücksichtigt. Wenn die letzte Ziffer kleiner als 5 ist, werden sie und alle unmittelbar vorhergehenden.
einfach entfernt. Wenn sie jedoch größer als 5 ist, werden die9
s in0
s geändert und die vorherige Ziffer erhöht (oder 1 vorangestellt, wenn keine vorherige Ziffer vorhanden war).quelle
Python 3 + SymPy, 54 Byte
Probieren Sie es online aus!
quelle
Scala, 44 Bytes
Prüfung:
quelle
Wunder , 10 Bytes
Verwendungszweck:
Stellen Sie die Dezimalgenauigkeit ein und fügen Sie bei Bedarf nachgestellte Nullen hinzu.
quelle
npm i -g wonderlang
. Verwenden Sie denwonder
Befehl, um die REPL zu starten, und fügen Sie den Code ein.J,
2217 BytesVielen Dank an @Conor O'Brien für die Korrektur meines Verständnisses der Regeln.
quelle
2 t '1234.456'
sollte1234.46
statt6 t '1234.456'