[英]int() conversion of float in 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。 我不知道為什么。 誰能解釋一下?
浮點數不能保證在你期望的數字上,它們可能只是勉強關閉,比如5.0
可能實際上是4.999...
並且因為int()
截斷/向下4.999...
,你得到你的錯誤。
許多銀行只是完全放棄了浮點問題而且只需要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之前不會返回整數
每次使用浮點數進行任何操作時,您都可以通過浮點表示可以表示的最接近的值來近似精確結果。 當你寫作
26.65
Python實際上使用
26.64999999999999857891452847979962825775146484375
使用浮點數進行數學運算時,結果將舍入到最接近的可表示數字。 print
將浮點數截斷為12位小數,因此小的不准確性不可見,但是在計算時
int(cents/5)
cents
實際上是4.999999999999858
, cents/5
是0.9999999999999716
,它向下4.999999999999858
為0
。
其他用戶已經解釋了浮點是如何不精確的。 在您的情況下,請考慮使用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')
記下創建原始actual
和paid
的數字的字符串。 他們是必需的。
當你執行int(x)
,它總是向下int(4.9999)
,這意味着如果你執行int(4.9999)
你將得到4.考慮使用int(round(x))
代替
編輯:
等等......如果你乘以100,你為什么還要使用花車呢? 你需要什么小數? 為什么不在你乘以100之后將美分變成一個int然后擺脫所有這些浮動的廢話?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.