Usando Python 2.7, ¿cómo redondeo mis números a dos lugares decimales en lugar del 10 o menos que da?
print "financial return of outcome 1 =","$"+str(out1)
Usando Python 2.7, ¿cómo redondeo mis números a dos lugares decimales en lugar del 10 o menos que da?
print "financial return of outcome 1 =","$"+str(out1)
Decimal
s, según lo que esté intentando hacer realmente.Respuestas:
Utilice la función incorporada
round()
:>>> round(1.2345,2) 1.23 >>> round(1.5145,2) 1.51 >>> round(1.679,2) 1.68
O función incorporada
format()
:>>> format(1.2345, '.2f') '1.23' >>> format(1.679, '.2f') '1.68'
O formato de cadena de nuevo estilo:
>>> "{:.2f}".format(1.2345) '1.23 >>> "{:.2f}".format(1.679) '1.68'
O formato de cadena de estilo antiguo:
>>> "%.2f" % (1.679) '1.68'
ayuda en
round
:>>> print round.__doc__ round(number[, ndigits]) -> floating point number Round a number to a given precision in decimal digits (default 0 digits). This always returns a floating point number. Precision may be negative.
fuente
Decimal("{:.2f}".format(val))
Decimal(format(val, '.2f'))
.Decimal('123.345').quantize(Decimal('1.00'), rounding=decimal.ROUND_HALF_UP)
te daDecimal('123.35')
. Por otro ladoDecimal(format(Decimal('123.345'), '.2f'))
le daDecimal('123.34')
porque la representación binaria de 123.345 es menor que 123.345.Ya que estás hablando de cifras financieras , NO QUIERES usar aritmética de punto flotante. Es mejor usar Decimal.
>>> from decimal import Decimal >>> Decimal("33.505") Decimal('33.505')
Formato de salida de texto con estilo nuevo
format()
(el valor predeterminado es redondeo medio par):>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.505"))) financial return of outcome 1 = 33.50 >>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.515"))) financial return of outcome 1 = 33.52
Vea las diferencias en el redondeo debido a la imprecisión del punto flotante:
>>> round(33.505, 2) 33.51 >>> round(Decimal("33.505"), 2) # This converts back to float (wrong) 33.51 >>> Decimal(33.505) # Don't init Decimal from floating-point Decimal('33.50500000000000255795384873636066913604736328125')
Forma adecuada de redondear los valores financieros :
>>> Decimal("33.505").quantize(Decimal("0.01")) # Half-even rounding by default Decimal('33.50')
También es común tener otros tipos de redondeo en diferentes transacciones:
>>> import decimal >>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_DOWN) Decimal('33.50') >>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_UP) Decimal('33.51')
Recuerde que si está simulando el resultado de la devolución, posiblemente tendrá que redondear en cada período de interés, ya que no puede pagar / recibir fracciones de centavos, ni recibir intereses sobre fracciones de centavos. Para las simulaciones, es bastante común usar el punto flotante debido a las incertidumbres inherentes, pero si lo hace, recuerde siempre que el error está ahí. Como tal, incluso las inversiones de interés fijo pueden diferir un poco en los rendimientos debido a esto.
fuente
También puedes usar
str.format()
:>>> print "financial return of outcome 1 = {:.2f}".format(1.23456) financial return of outcome 1 = 1.23
fuente
Al trabajar con centavos / enteros. Te encontrarás con un problema con 115 (como en $ 1,15) y otros números.
Tenía una función que convertiría un Integer en un Float.
... return float(115 * 0.01)
Eso funcionó la mayor parte del tiempo, pero a veces devolvía algo así
1.1500000000000001
.Así que cambié mi función para volver así ...
... return float(format(115 * 0.01, '.2f'))
y eso volverá
1.15
. No'1.15'
o1.1500000000000001
(devuelve un flotante, no una cadena)Principalmente estoy publicando esto para recordar lo que hice en este escenario, ya que este es el primer resultado en Google.
fuente
Lo mejor, creo, es usar la función format () :
>>> print("financial return of outcome 1 = $ " + format(str(out1), '.2f')) // Should print: financial return of outcome 1 = $ 752.60
Pero tengo que decir: no use redondeo o formato cuando trabaje con valores financieros.
fuente
format
requiere que no sea una cadena para el formato f. Si no, obtiene un ValueError. El código correcto es:format(out1, '.2f')
sin conversión a cadenaCuando usamos la función round (), no dará valores correctos.
puedes comprobarlo usando, round (2.735) y round (2.725)
por favor use
import math num = input('Enter a number') print(math.ceil(num*100)/100)
fuente
print "financial return of outcome 1 = $%.2f" % (out1)
fuente
Una solución alternativa bastante simple es convertir el flotador en cadena primero, seleccionar la subcadena de los primeros cuatro números y finalmente convertir la subcadena de nuevo a flotante. Por ejemplo:
>>> out1 = 1.2345 >>> out1 = float(str(out1)[0:4]) >>> out1
Puede que no sea muy eficiente, pero simple y funciona :)
fuente
Redondeando al siguiente 0.05, haría de esta manera:
def roundup(x): return round(int(math.ceil(x / 0.05)) * 0.05,2)
fuente