2015-12-18 96 views
2

我正在使用.get_seconds()函數減去時間並將datetime轉換爲字符串。移動十進制而不捨入

diff = end_date - start_date 
seconds = diff.total_seconds() 
months = seconds/2628000 
years = months/12 

當我打印years,數量就出來0.830136986301

我在Python

format(years, '.0f') 

看格式化選項,但這個輪次高達1。無論如何,我可以在沒有四捨五入的情況下將「十進制」減掉?

+2

是'Math.floor()'你想要什麼? – Barmar

+1

是的!這就是我一直在尋找的:-)謝謝。 –

回答

0

這工作:

format(math.floor(number), '.0f') 
1

是否有反正我可以只是「削減」十進制關閉沒有它四捨五入?

那就是顧名思義就不可能,因爲「削減十進制」意味着四捨五入。所以,不,你不能。但是,您可以操縱數字四捨五入的方式!

從我明白你的問題,你可以強制轉換爲int,以獲得期望的結果(這類似於向下取整),像這樣:

>>>print(int(years)) 
0 
+0

沒有限定符的「四捨五入」意味着四捨五入到最接近的整數。這就是他所要求的如何避免。 – Barmar

+1

@Barmar「削減小數」不是四捨五入嗎?如果我對他所期望的結果的解釋是正確的,那簡直就是四捨五入。 –

+0

當他說「沒有四捨五入」時,他的意思是「沒有舍入到最接近的整數」。他寫的代碼四捨五入,無論哪一個更接近。 – Barmar

1

你需要什麼叫整數除法,這是用「//」執行的。

#And then 
years // 12 # Will give you integer without the decimals. 
+1

'//'將在Python 2和Python 3中執行整數除法,而不會在將來導入。術語「真正的劃分」是指Python 3中'/'的行爲,它給出了浮點結果。 –

+0

事實上,你是對的我只是使用它,因爲我認爲它更好地區分python3中的/和//,我不會改變答案,因爲隨着你的評論它變得清晰。 – Akis

+0

對'/'的改變與'//'的工作方式無關,並且一直有效。 – chepner

1

該解決方案有些使用四捨五入,但你可以說:

years = math.floor(months/12) 

更妙的是,雖然,你可以說截斷值:

years = math.trunc(months/12) 

我個人因爲截斷和地板處理負值的方式不同,所以更喜歡截斷地板。但是,對於您的情況,假設該值總是正值,則兩者都應該是可以產生相同結果的合適解決方案。另外,它們都依賴於math模塊,因此您需要在腳本的頂部包含import math

1

如果您的號碼可能是負面的小心地板功能。這裏是各種float和int轉換函數的比較

list(map(math.floor, (0.734, -0.734, 0.314, -0.314))) 
[0, -1, 0, -1] 

list(map(math.ceil, (0.734, -0.734, 0.314, -0.314))) 
[1, 0, 1, 0] 

list(map(int, (0.734, -0.734, 0.314, -0.314))) 
[0, 0, 0, 0] 

list(map(round, (0.734, -0.734, 0.314, -0.314))) 
[1, -1, 0, 0] 

list(map(math.trunc, (0.734, -0.734, 0.314, -0.314))) 
[0, 0, 0, 0] 
+1

感謝您的支持! –