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 Bytes
0
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?