2014-01-20 43 views
0

我試圖強制一個浮點數加到小數點後第二位。我知道這不是最好的做法,但這正是我正在開發的程序所需要的。因此,例如:python 2.7強制將小數點後兩位加起來

100.00 = 100.00

100.001 = 100.01

100.009 = 100.01

我已經得到相當接近我需要math.ceil結果和尖端我讀另一篇文章,但我遇到了一個問題,如果輸入數字已經完全以2個小數位結尾,則會不必要地湊齊。這裏有一個例子:

import math 

taxpcnt = 1.12 
roomsubtotal = 699.00 

roomttl = math.ceil(taxpcnt * roomsubtotal * 100)/100 

print roomttl 

該相信還是會回到782.88,因爲699 * 1.12恰好是782.88,而是它返回782.89。韋爾德是如果我'打印taxpcnt * roomsubtotal',我得到782.88。如果我將代碼更改爲:

roomttl = math.ceil(782.88 * 100)/100 

我得到正確的值。但有些原因,所有這一切都沒有計算正確。

關於如何正確獲取我想要實現的任何提示?

編輯:我覺得我已經拼湊起來的一個解決方案:

import math 

taxpcnt = 1.12 
roomsubtotal = 699.00 

rate = "%.2f" % (taxpcnt * roomsubtotal * 100) 
rate = float(rate) 

roomttl = math.ceil(rate)/100 

不知道這是最好的方法,但至少它似乎工作。

+1

如果您正在處理金錢,請嘗試以美分(或便士,或任何您正在處理的貨幣)進行所有計算。所以,而不是782.88,使用78288,並在最後與字符串格式轉換。或者,使用Decimal.decimal()。 – MattDMo

+0

此外,您可以使用round()而不是乘法和除以100,其中第二個參數是要舍入的數字。與Decimal混合應該爲您帶來一個簡單的解決方案。 – bgusach

+0

@MattDMo:以分爲單位執行算術不能解決算術問題。如果算術使用浮點,它仍然有浮點錯誤。如果算術使用整數,它仍然有整數錯誤。例如,在這個問題中,貨幣數量乘以1.12。即使貨幣金額以美分計算,該產品也會包含12美分的倍數。在整數算術中會被截斷。然後,由於小數額已經丟失,因此目前不能四捨五入。 –

回答

1

歡迎來到浮點世界。請閱讀this以瞭解發生了什麼。

699 * 1.12的結果不能由計算機準確表示,因此舍入結果不正確。

>>> 699 * 1.12 
782.8800000000001 

如果你只關心兩位小數考慮使用不同類型,如Decimal

+0

謝謝。我已經使用了一些這些信息來組合一個解決方案(發佈爲我的文章的編輯) – crookedleaf

相關問題