Algunos números decimales no se pueden representar con precisión como flotantes binarios debido a la representación interna de los flotantes binarios. Por ejemplo: redondear 14.225 a dos dígitos decimales no da como resultado 14.23 como cabría esperar sino 14.22.
Python :
In: round(14.225, 2)
Out: 14.22
Sin embargo, supongamos que tenemos una representación de cadena de 14.225 como '14 .225 ', deberíamos poder lograr nuestro redondeo deseado '14 .23' como una representación de cadena.
Este enfoque puede generalizarse con precisión arbitraria.
Posible solución de 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
Uso :
# 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
Tarea
Argumento de entrada 1 : una cadena que contiene
- al menos un dígito (
0
,1
,2
,3
,4
,5
,6
,7
,8
,9
), - como máximo un punto decimal (
.
) que debe estar precedido por al menos un dígito, - un menos opcional (
-
) como primer carácter.
Argumento de entrada 2 : un entero no negativo
Salida : la cadena correctamente redondeada (base 10)
redondeo = redondear la mitad lejos de cero
Este es un código de golf . ¡El número más bajo de bytes gana!
round(A,B
5 bytes
0
no es un entero positivo, es "no negativo".
123.4 & 5 --> 123.40000
? ¿O podemos suponer que la segunda entrada nunca será mayor que la cantidad de decimales después del punto en la primera entrada?