Estaba volviendo a leer What's New In Python 3.0 y dice:
La estrategia de redondeo de la función round () y el tipo de retorno han cambiado. Los casos intermedios exactos ahora se redondean al resultado par más cercano en lugar de alejarse de cero. (Por ejemplo, la ronda (2.5) ahora devuelve 2 en lugar de 3.)
y la documentación para la ronda :
Para los tipos integrados que admiten round (), los valores se redondean al múltiplo más cercano de 10 a la potencia menos n; si dos múltiplos están igualmente cerca, el redondeo se realiza hacia la opción pareja
Entonces, bajo v2.7.3 :
In [85]: round(2.5)
Out[85]: 3.0
In [86]: round(3.5)
Out[86]: 4.0
como hubiera esperado Sin embargo, ahora bajo v3.2.3 :
In [32]: round(2.5)
Out[32]: 2
In [33]: round(3.5)
Out[33]: 4
Esto parece contrario a la intuición y contrario a lo que entiendo sobre el redondeo (y está destinado a hacer tropezar a las personas). El inglés no es mi lengua materna, pero hasta que leí esto pensé que sabía lo que significaba el redondeo: - / Estoy seguro de que en el momento en que se introdujo la v3 debe haber habido una discusión sobre esto, pero no pude encontrar una buena razón en mi busqueda
- ¿Alguien tiene idea de por qué esto se cambió a esto?
- ¿Hay otros lenguajes de programación convencionales (por ejemplo, C, C ++, Java, Perl, ..) que hacen este tipo de redondeo (para mí inconsistente)?
¿Que me estoy perdiendo aqui?
ACTUALIZACIÓN: El comentario de @ Li-aungYip sobre "Redondeo del banco" me dio el término / palabras clave de búsqueda correctos para buscar y encontré esta pregunta SO: ¿Por qué .NET usa el redondeo del banco de manera predeterminada? , así que lo leeré con cuidado.
fuente
Respuestas:
La forma de Python 3.0 se considera el método de redondeo estándar en estos días, aunque algunas implementaciones de lenguaje aún no están en el bus.
La técnica simple de "siempre redondear 0.5 arriba" resulta en un ligero sesgo hacia el número más alto. Con grandes cantidades de cálculos, esto puede ser significativo. El enfoque de Python 3.0 elimina este problema.
Hay más de un método de redondeo de uso común. IEEE 754, el estándar internacional para matemáticas de punto flotante, define cinco métodos de redondeo diferentes (el que usa Python 3.0 es el predeterminado). Y hay otros.
Este comportamiento no es tan conocido como debería ser. AppleScript fue, si no recuerdo mal, uno de los primeros en adoptar este método de redondeo. El
round
comando en AppleScript en realidad ofrece varias opciones, pero el valor predeterminado es redondeado, incluso en IEEE 754. Aparentemente, el ingeniero que implementó elround
comando se hartó tanto de todas las solicitudes para "hacer que funcione como aprendí en escuela "que implementó precisamente eso:round 2.5 rounding as taught in school
es un comando válido de AppleScript. :-)fuente
3
para2.5.round
Puede controlar el redondeo que obtiene en Py3000 utilizando el módulo Decimal :
fuente
ROUND_HALF_UP
es la misma que el comportamiento anterior de Python 2.X.setcontext()
función.quantize(decimal.Decimal('1')
aquantize(decimal.Decimal('0.00')
si desea redondear a los 100 más cercanos, como por dinero.round(number, ndigits)
tiempo quendigits
sea positivo, pero molestamente no puede usarla para reemplazar algo comoround(5, -1)
.Solo para agregar aquí una nota importante de la documentación:
https://docs.python.org/dev/library/functions.html#round
Así que no se sorprenda de obtener los siguientes resultados en Python 3.2:
fuente
2.675
exactamente: lo más cerca que puede estar la computadora2.67499999999999982236431605997495353221893310546875
. Eso está bastante cerca, pero no es exactamente igual a2.675
: está muy ligeramente más cerca2.67
que a2.68
. Entonces, laround
función hace lo correcto y la redondea al valor más cercano de 2 dígitos después del punto, a saber2.67
. Esto no tiene nada que ver con Python, y todo que ver con punto flotante binario.Recientemente tuve problemas con esto también. Por lo tanto, he desarrollado un módulo python 3 que tiene 2 funciones trueround () y trueround_precision () que abordan esto y dan el mismo comportamiento de redondeo al que se usaban desde la escuela primaria (no el redondeo bancario). Aquí está el módulo. Simplemente guarde el código y cópielo o impórtelo. Nota: el módulo trueround_precision puede cambiar el comportamiento de redondeo según las necesidades de acuerdo con los indicadores ROUND_CEILING, ROUND_DOWN, ROUND_FLOOR, ROUND_HALF_DOWN, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_UP y ROUND_05UP en el módulo decimal (consulte la documentación de los módulos para obtener más información). Para las funciones a continuación, consulte las cadenas de documentos o use help (trueround) y help (trueround_precision) si se copia en un intérprete para obtener más documentación.
Espero que esto ayude,
Narnie
fuente
Python 3.x redondea .5 valores a un vecino que es par
sin embargo, uno puede cambiar el redondeo decimal "atrás" para siempre redondear .5 hacia arriba, si es necesario:
fuente
Comportamiento de redondeo de Python 2 en Python 3.
Sumando 1 en el decimoquinto lugar decimal. Precisión de hasta 15 dígitos.
fuente
2.675
es2.67499999999999982236431605997495353221893310546875
. Agregar 1e-15 lo inclinará sobre 2.675 y lo redondeará correctamente. si la fracción ya está sobre la constante del código, agregar 1e-15 no cambiará nada al redondeo.Algunos casos:
Para arreglar:
Si desea más decimales, por ejemplo 4, debe agregar (+ 0.0000001).
Trabaja para mi.
fuente
Reproducción de muestra:
API: https://docs.python.org/3/library/functions.html#round
Estados:
Teniendo en cuenta esta idea, puede usar algunas matemáticas para resolverlo
ahora puede ejecutar la misma prueba con my_round en lugar de round.
fuente
La forma más fácil de redondear en Python 3.x como se enseña en la escuela es usar una variable auxiliar:
Y estos serán los resultados de la serie 2.0 a 3.0 (en pasos de 0.1):
fuente
Puede controlar el redondeo utilizando el módulo math.ceil:
fuente
Prueba este código:
El resultado será:
Salida que puede consultar aquí: https://i.stack.imgur.com/QQUkS.png
fuente