簡體   English   中英

int()轉換python中的float

[英]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.999999999999858cents/50.9999999999999716 ,它向下4.9999999999998580

其他用戶已經解釋了浮點是如何不精確的。 在您的情況下,請考慮使用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的數字的字符串。 他們是必需的。

當你執行int(x) ,它總是向下int(4.9999) ,這意味着如果你執行int(4.9999)你將得到4.考慮使用int(round(x))代替

編輯:

等等......如果你乘以100,你為什么還要使用花車呢? 你需要什么小數? 為什么不在你乘以100之后將美分變成一個int然后擺脫所有這些浮動的廢話?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM