2013-12-12 57 views
1

我試圖限制一個數字的輸出爲4個字符(包括小數)。如何限制輸出的最大字符數?

def costEdit(nCost): 
    nCost = '%.2f'%(nCost*1.25) 
    nCost = nCost * 1.25 
    return nCost 

我希望nCost在2位小數點被截斷。例如。如果nCost爲8.364912734,則將其關閉至8.36,並編輯nCost變量以替換該值。有任何想法嗎?

即時得到錯誤:使用它作爲

Traceback (most recent call last): 
    File "C:\Python33\My Codes\TextTowns\TextTowns.py", line 59, in <module> 
    costEdit(nCost) 
    File "C:\Python33\My Codes\TextTowns\TextTowns.py", line 27, in costEdit 
    nCost = nCost*1.25 
    TypeError: can't multiply sequence by non-int of type 'float' 

林:costEdit(nCost)

+2

術語nitpick:如果nCost等於'8.364912734',則它不是整數。整數是整數。 – Kevin

+0

我的錯誤,謝謝:P – HarryCBurn

+0

這裏是一個附註。如果你得到的數字大於9.99,你會遇到5個以上的字符。限制到2位小數還是隻有4個字符更重要?你願意擁有'1000'而不是'1000.01'嗎? – jwarner112

回答

4

您遇到的問題是混淆數字和一個數字的字符串表示。這些是不同的事情。

當你這樣做:

nCost = '%.2f'%(nCost*1.25) 

...你被乘以1.25的號碼,然後與代表人數最多兩個小數點的字符串替換它。所以,當你這樣做時:

nCost = nCost * 1.25 

...你試圖乘以1.25的字符串,這是沒有意義的。


我懷疑你根本不想要一個字符串;你只是想將編號爲。當你通過1.25乘儘快

nCost = round(nCost*1.25, 2) 

當然再次,你可以「非圓」​​,它由一位小數點或兩個:要做到這一點,使用round功能

>>> nCost = 1.33333 
>>> nCost = round(nCost*1.25, 2) 
>>> nCost 
1.33 
>>> nCost = nCost * 1.25 
>>> nCost 
1.6625 

實際上,在對數值進行算術運算之前對數值進行舍入幾乎總是一個壞主意;這只是不必要地增加舍入誤差。最好儘可能長時間保持最高精度值,並在最後可能的第二個週期內循環 - 理想情況下,在打印/寫入磁盤等中使用格式化%.2f/{:.2f}。階段。


要記住的另一件事是,並非所有的實數都可以完全表示爲浮點數。因此,例如,round(13.4999, 2)實際上是13.949999999999999289457264。一個簡單的reprstr%f將打印出來作爲13.95,所以你可能沒有注意到...但它仍然不完全是13.95。

解決此問題和其他問題的最佳方法是使用Decimal類型而不是float類型。然後,您可以將值四捨五入到小數點後兩位,以數字在兩位小數的上下文中等。

+0

非常感謝!完美工作,沒有缺點! *給騎士胡德* – HarryCBurn

0

的Python 2.6或更高版本,使用格式():

print('{0:.3g}'.format(nCost)) 
+0

'{0:.2f}'。格式(nCost)所以2f不是2g – jdennison

+0

您還可以談談如何將此值作爲數字類型?這將滿足「編輯nCost變量以替換該問題」部分的問題。 – Kevin

0

您可以使用特殊格式代碼浮點數

print('{0:.2f}'.format(nCost)) 

更改2F至4f增加的位數

文檔(http://docs.python.org/2/library/stdtypes.html#string-formatting

+0

這似乎沒有工作,任何想法?現在代碼: 'def costEdit(): 全局nCost nCost = nCost * 1.25 print('{0:.2g}'.format(nCost))' – HarryCBurn

+0

使用2f而不是2g。這應該工作。因此'{0:.2f}'不是'{0:.2g}' – jdennison

+0

這與現有代碼中的'%.2f'%'沒有任何不同。它並沒有解決他的問題(試圖將格式化的字符串乘以1.25,而不是乘以數字然後格式化)。 – abarnert

2

一個做到這一點的方法是用下面的:

def costEdit(nCost): 
    nCost = '%.2f'%(nCost*1.25) 
    #nCost = nCost*1.25 
    return nCost 

讓我打破下來你。

走線:

'%.2f'%(nCost*1.25) 

而且它分解爲它的組成部分:

(' ((%) .2f) ')%(nCost*1.25) 
  • ''一切都只是一個普通的字符串。
  • %是一個符號,意思是「稍後替換」。
  • .2f是Python中的一個命令,它在小數點後截斷2個位置。
  • %(nCost*1.25)意味着「nCost*1.25是你放什麼地方的%

所以爲了,它的nCost*1.25數學,把它裏面的字符串,然後切斷一切,給你留下什麼。

請注意,我已將您的costEdit函數重寫爲接受nCost作爲參數。這意味着現在你可以撥打:

costEdit(nCost) 

與任何你想要的數字,它會做數學。

另請注意我已將print替換爲return。這意味着,現在,你將不得不寫:

print costEdit(80) 

得到

100 

但是現在意味着你可以做數學與costEdit,如:

print 4*costEdit(80) 

,而是一路打印100,它只會打印

400 

有問題?發表評論。

快樂編碼!

編輯:關於你的錯誤,

我想我已經轉載和理解的問題。

當我鍵入:

costEdit('15') 

我明白你的錯誤。

這是因爲當你做costEdit('15')時,你輸入的是'15'而不是15。如果值介於''""之間,則表示處理值爲類型string

在python中,不能將float(數字的類型)與string相乘。這就是抱怨。

要糾正這種情況,只需刪除引號。然後輸入floatint(整數)的數字,兩者都可以乘以floatcostEdit()中的值1.25)。

我希望這可以解決您的問題 - 我必須在PC上下班。如果沒有幫助,留下評論,明天我會回來。

否則,我很高興我能幫助,記得選擇對你的問題一個最佳答案,使那些誰幫助可以得到他們的珍貴珍貴pointssssss

+0

編輯您的原始問題 - 添加到最後。插入你當前使用的代碼塊來獲得這個錯誤,然後是這個錯誤本身。如果我不能幫你,別人會。 – jwarner112

+0

它在這種情況下很好。你可以回去,包括你輸入的是什麼嗎?正如在行中:'costEdit(x)'? – jwarner112

+0

@ user3092506試圖在我更新的帖子中解決您的問題。給它一個閱讀。希望我幫助! – jwarner112