Alcuni numeri decimali non possono essere rappresentati con precisione come float binari a causa della rappresentazione interna dei float binari. Ad esempio: arrotondando da 14.225 a due cifre decimali non si ottiene 14.23 come ci si potrebbe aspettare ma in 14.22.
Python :
In: round(14.225, 2)
Out: 14.22
Supponiamo, tuttavia, che abbiamo una rappresentazione di stringa di 14.225 come '14 .225 ', dovremmo essere in grado di ottenere il nostro arrotondamento desiderato '14 .23' come rappresentazione di stringa.
Questo approccio può essere generalizzato a precisione arbitraria.
Possibile soluzione Python 2/3
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
Utilizzo :
# 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
Compito
Argomento di input 1 : una stringa contenente
- almeno una cifra (
0,1,2,3,4,5,6,7,8,9), - al massimo un punto decimale (
.) che deve essere preceduto da almeno una cifra, - un segno meno (
-) opzionale come primo carattere.
Argomento di input 2 : un numero intero non negativo
Output : la stringa correttamente arrotondata (base 10)
arrotondamento = arrotondamento a metà distanza da zero
Questo è un codice-golf . Vince il numero più basso di byte!
round(A,B5 byte
0non è un numero intero positivo, è "non negativo".
123.4 & 5 --> 123.40000? Oppure possiamo supporre che il secondo input non sarà mai maggiore della quantità di decimali dopo il punto nel primo input?