Python で小数をパーセント表示にしたい

学習メモです。

lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65]

['1%', '20.1%', '15.75%', '2.5%', '32.2%', '65%']

としたい。

最初に試したのは

リストを定義して、内包表記でリストの各要素を100倍

>>> lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65]
>>> print [x*100 for x in lst]
[1.0, 20.100000000000001, 15.75, 2.5, 32.200000000000003, 65.0]

うわぁぁぁあ

浮動小数点型

そもそも演算前から…

>>> lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65]
>>> print lst
[0.01, 0.20100000000000001, 0.1575, 0.025000000000000001, 0.32200000000000001, 0.65000000000000002]

orz

>>> type(lst[1])
<type 'float'>

float は浮動小数点型。んで、この浮動小数点数は2進数の分数として表現されているそうで、0.201 なんかは無限小数になっちゃうんですって。

decimal モジュール

10進数を正確に表現できるそうです。

>>> from decimal import Decimal
>>> lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65]
>>> print [Decimal(str(x)) for x in lst]
[Decimal('0.01'), Decimal('0.201'), Decimal('0.1575'), Decimal('0.025'), Decimal('0.322'), Decimal('0.65')]

str() よりも repr() の方がいいのかな?? もうちょっと調べなくっちゃ。
ただ、Decimal でも10進数の無限小数となる場合は誤差が生じるそうです。要注意。

結果

文字列フォーマット操作なんかも使って

>>> from decimal import Decimal
>>> lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65]
>>> print ['%g%%' % y for y in [Decimal(str(x))*Decimal('100') for x in lst]]
['1%', '20.1%', '15.75%', '2.5%', '32.2%', '65%']

できたー