Certains nombres décimaux ne peuvent pas être représentés avec précision comme des flottants binaires en raison de la représentation interne des flotteurs binaires. Par exemple: arrondir 14,225 à deux chiffres décimaux ne donne pas 14,23 comme on pouvait s'y attendre mais 14,22.
Python :
In: round(14.225, 2)
Out: 14.22
Supposons cependant que nous ayons une représentation sous forme de chaîne de 14,225 en tant que «14,225», nous devrions pouvoir atteindre l'arrondi souhaité «14,23» en tant que représentation sous forme de chaîne.
Cette approche peut être généralisée à une précision arbitraire.
Solution Python 2/3 possible
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
Utilisation :
# 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
Tâche
Argument d'entrée 1 : une chaîne contenant
- au moins un chiffre (
0
,1
,2
,3
,4
,5
,6
,7
,8
,9
), - au plus un point décimal (
.
) qui doit être précédé d'au moins un chiffre, - un moins optionnel (
-
) comme premier caractère.
Argument d'entrée 2 : un entier non négatif
Sortie : la chaîne correctement arrondie (base 10)
arrondi = Arrondir la moitié de zéro
Ceci est un code-golf . Le plus petit nombre d'octets gagne!
round(A,B
5 octets
0
n'est pas un entier positif, il est "non négatif".
123.4 & 5 --> 123.40000
? Ou peut-on supposer que la deuxième entrée ne sera jamais supérieure à la quantité de décimales après le point de la première entrée?