Quero que `a' seja arredondado para 13.95.
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
A função round
não funciona da maneira que eu esperava.
Você está encontrando o antigo problema com números de ponto flutuante que nem todos os números podem ser representados exatamente. A linha de comando está apenas mostrando-lhe a forma completa de ponto flutuante da memória.
Com representação de ponto flutuante, a sua versão arredondada é o mesmo número. Como os computadores são binários, eles armazenam números de ponto flutuante como um número inteiro e depois o dividem por uma potência de dois, então 13,95 será representado de forma similar ao 125650429603636838/(2***53).
Os números duplos de precisão têm 53 bits (16 dígitos) de precisão e os flutuadores regulares têm 24 bits (8 dígitos) de precisão. O tipo de ponto flutuante em Python usa dupla precisão para armazenar os valores.
Por exemplo,
>>> 125650429603636838/(2**53)
13.949999999999999
>>> 234042163/(2**24)
13.949999988079071
>>> a=13.946
>>> print(a)
13.946
>>> print("%.2f" % a)
13.95
>>> round(a,2)
13.949999999999999
>>> print("%.2f" % round(a,2))
13.95
>>> print("{0:.2f}".format(a))
13.95
>>> print("{0:.2f}".format(round(a,2)))
13.95
>>> print("{0:.15f}".format(round(a,2)))
13.949999999999999
Se você estiver após apenas duas casas decimais (para exibir um valor de moeda, por exemplo), então você tem um par de escolhas melhores:
Você pode modificar o formato de saída:
>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
Está a fazer exactamente o que lhe disseste para fazer e está a funcionar correctamente. Leia mais sobre confusão de ponto flutuante e talvez tente objetos decimal em vez disso.