2013-07-24 50 views
2

我在下面的代碼中將float轉換爲整數。但是,由此產生的輸出是不正確的鎳。int()在python中float的轉換

代碼:

actual = 25 
paid = 26.65 
cents = (paid-actual)*100 
quarters = int(cents/25) 
cents = cents %25 
dimes = int(cents/10) 
cents = cents %10 
nickels = int(cents/5) 
print quarters, dimes, nickels,cents 
print 5.0/5,int(5.0/5) 

輸出繼電器:

6 1 0 5.0 
1.0 1 

預期輸出

6 1 1 5.0 
1.0 1 

如果我明確做INT(5.0/5)我得到1,但是當我的代碼中分配給一個變量的時候,我得到0。我不知道爲什麼。有人可以解釋嗎?

回答

6

浮點數不能保證當場對你期望的數量,他們可能只是勉強過,說5.0實際上可能是4.999...,自int()截短/幾輪下來,你會得到你的錯誤。

許多銀行只是完全放棄對浮點問題,只是$ 1.00 = 100 工作,我會建議你做同樣的,就像這樣:

actual = 25 
paid = 26.65 
cents = int(round(paid*100)) #Turns 26.65 into 2665 before you do any float math 
dollars = cents/100 
cents %= 100 
quarters = cents/25 
cents %= 25 
dimes = cents/10 
cents %= 10 
nickels = cents/5 
print quarters, dimes, nickels,cents 
print 5.0/5,int(5.0/5) 

,這個輸出2 1 1 5因爲那是2個季度,1毛錢和1個鎳= $。65

通常情況下,您希望儘可能圓化以保持精度,但是當您使用金錢工作時,我認爲完全使用整數工作會使浮動的惡夢更快消失。

而且,由於使用的是2.6,你將需要轉換爲int()因爲round()直到3.1

+0

我甚至可以避免26.65,直接進入2500和2665. –

+0

@LennartRegebro不想改變他的輸入,但是我會做類似的事情 – Stephan

1

當你做int(x),它始終幾輪下來,這意味着如果你做int(4.9999)你會得到4.考慮使用int(round(x))代替

編輯:

稍候......如果你乘100,爲什麼你甚至使用花車?你需要什麼小數?爲什麼不在你乘以100後把美分變成一個int,然後擺脫所有這些浮點廢話?

+0

int(round(x))'會在不應該使用的情況下四捨五入,使用太多的硬幣。 – user2357112

+0

這裏的問題是他的浮點數不準確。而不是在類型轉換中四捨五入,每次設置時都要轉動角錢。所以它變成了「美分=圓(美分%25)」。我剛剛處理了一個類似的問題,可能會幫助你(http://stackoverflow.com/questions/17779336/python-code-not-working-confusion-about-if-statement/17779465#17779465) – scohe001

+0

四捨五入給出了輸出作爲'7 1 1'而應該是'6 1 1' – misguided

3

Floating point numbers cannot represent all real numbers

每次您使用浮點數進行任何操作時,您都會用浮點數表示可以表示的最接近的東西來近似確切的結果。當你寫

26.65 

Python的實際使用

26.64999999999999857891452847979962825775146484375 

當你使用浮點數運算,結果四捨五入到最接近的可表示數。 print截斷浮點數到12位小數,所以小的不準確是不可見的,但是當你計算

int(cents/5) 

cents實際上是4.999999999999858cents/50.9999999999999716,其向下取整爲0

+0

我們怎樣才能驗證分的價值?當我打印出來時顯示5.0 – misguided

+1

@misguided:'print repr(cents)'。就我個人而言,我覺得顯示精度的默認12位數是錯誤的。如果人們想要12位數字,他們可以通過字符串格式獲取。 – user2357112

2

其他用戶已經解釋了怎麼點的浮動是不準確不返回一個整數。在你的情況,考慮使用Decimal進行更精確的計算:

>>> from decimal import Decimal 
>>> actual = Decimal('25') 
>>> paid = Decimal('26.65') 
>>> actual,paid 
(Decimal('25'), Decimal('26.65')) 
>>> cents = (paid-actual)*100 
>>> cents 
Decimal('165.00') 
>>> quarters = int(cents/25) 
>>> cents = cents % 25 
>>> dimes = int(cents/10) 
>>> cents = cents %10 
>>> nickels = int(cents/5) 
>>> print quarters, dimes, nickels,cents 
6 1 1 5.00 
>>> cents 
Decimal('5.00') 

。注意到字符串創建原始actualpaid的數字。他們是必需的。