Redondear la mitad hasta el decimal

R por defecto utiliza la mitad redonda para igualar la función round() . Pero no siempre parece ser cierto cuando se redondea a un número definido de lugares decimales:

 # R code round(1.225,2) #[1] 1.23 round(1.2225,3) #[1] 1.222 round(1.22225,4) #[1] 1.2223 round(1.222225,5) #[1] 1.22222 

Comparando con python, usando el módulo decimal:

 # Python code import decimal a = decimal.Decimal("1.225") b = decimal.Decimal("1.2225") c = decimal.Decimal("1.22225") d = decimal.Decimal("1.222225") a.quantize(decimal.Decimal('1.00'), decimal.ROUND_HALF_EVEN) #Decimal('1.22') b.quantize(decimal.Decimal('1.000'), decimal.ROUND_HALF_EVEN) #Decimal('1.222') c.quantize(decimal.Decimal('1.0000'), decimal.ROUND_HALF_EVEN) #Decimal('1.2222') d.quantize(decimal.Decimal('1.00000'), decimal.ROUND_HALF_EVEN) #Decimal('1.22222') 

De los documentos de la biblioteca decimal de Python, sobre la función de cuantización :

Devuelva un valor igual al primer operando después de redondear y que tiene el exponente del segundo operando.

No estoy seguro de si estoy en lo cierto, pero parece que el resultado de Python es correcto.

Pregunta:

¿Cuál es correcto y cómo lograr los resultados correctos utilizando los dos idiomas?

El problema es la precisión finita de los valores de punto flotante:

 >>> '%.18f' % 1.225 '1.225000000000000089' >>> '%.18f' % 1.2225 '1.222499999999999920' >>> '%.18f' % 1.22225 '1.222250000000000059' >>> '%.18f' % 1.222225 '1.222224999999999895' 

Pythons La clase decimal es exacta en este sentido.