2009-11-16 59 views
9

我有困難以下方式浮點數轉換爲字符串:轉換浮到字符串切割零點小數AFER點在Python

20.02 --> 20.02 
20.016 --> 20.02 
20.0 --> 20 

似乎%g格式是最好的那個,但我遇到奇怪的結果:

In [30]: "%.2g" % 20.03 
Out[30]: '20' 

In [31]: "%.2g" % 20.1 
Out[31]: '20' 

In [32]: "%.2g" % 20.3 
Out[32]: '20' 

In [33]: "%.2g" % 1.2 
Out[33]: '1.2' 

In [34]: "%.2g" % 1.0 
Out[34]: '1' 

In [35]: "%.2g" % 2.0 
Out[35]: '2' 

In [36]: "%.2g" % 2.2 
Out[36]: '2.2' 

In [37]: "%.2g" % 2.25 
Out[37]: '2.2' 

In [38]: "%.2g" % 2.26 
Out[38]: '2.3' 

In [39]: "%.3g" % 2.26 
Out[39]: '2.26' 

In [40]: "%.3g" % 2.25 
Out[40]: '2.25' 

In [41]: "%.3g" % 20.02 
Out[41]: '20' 

In [42]: "%.3g" % 20.016 
Out[42]: '20' 

In [43]: "%.20g" % 20.016 
Out[43]: '20.015999999999998238' 

目前我所知道的唯一的解決辦法是檢查的數量是否是int和應用%d代替%f格式 - 這太複雜了,我認爲。

有誰知道爲什麼上面的東西都有毛病?如何以更簡單的方式做到這一點?

謝謝。

+1

阿凡達可能不會持續太久。 – 2009-11-16 15:47:24

+0

@Jed,現在似乎已經持續了至少一年;) – 2010-12-26 11:07:27

回答

10

使用%f格式說明:

('%.2f' % (value,)).rstrip('0').rstrip('.') 

使用round()功能:

str(round(value)).rstrip('0').rstrip('.') 
1

嘗試的東西比20位少一點。如果你使用20位數字,它會給你浮點值的20位數字表示,這可能看起來有點奇怪。

2

我不確定你到底在找什麼複雜的東西 - 你會得到完全指定的結果,例如: here。例如:

In [32]: "%.2g" % 20.3 
Out[32]: '20' 

In [33]: "%.2g" % 1.2 
Out[33]: '1.2' 

在每一種情況下,你已經要求兩個數字在所有的顯示,這就是正在發生的事情(包括數字來後點之前,在一種情況下,一前一在其他情況下,後,但這是數字各自幅度的明顯結果)。

當你詢問20位數字時,你會看到20位數 - 當然大多數沒有意義(雙精度IEEE浮點僅適用於大約16位精度),所以更合理要求減少。你當然知道浮點數用二進制表示,如解釋here,對吧?當然,使用decimal(當然,因爲你的計算機的硬件供應是二進制浮點,所以十進制版本必須全部用軟件合成),你需要的是十進制表示的浮點數(例如,用於貨幣計算)。與%g

5

使用圓形在一起 - 你想最多2個位數顯示,因此輪兩位數字,然後用%g打印它儘可能短:

>>> "%g" % round(20.016, 2) 
'20.02' 
>>> "%g" % round(20, 2) 
'20' 
1

您可以使用.format而不是%

>>> '{:.2f}'.format(3.0101) 
'3.01' 
>>> type('{:.2f}'.format(3.0101)) 
str 

有很多更多的東西,這是不可能使用%但可以使用.format來完成。

更多格式的詳細信息,看看pyformat