簡體   English   中英

Python 中的 Float 到 Int 類型轉換,用於大整數/數字

[英]Float to Int type conversion in Python for large integers/numbers

在我正在處理的以下代碼中需要一些幫助。 為什么“a”中的原始數字在經過類型轉換時與“c”中的數字不同。 當“a”和“c”通過 float -> int 類型轉換時,我們有什么辦法可以使它相同?

a = '46700000000987654321'
b = float(a)  => 4.670000000098765e+19
c = int(b)    => 46700000000987652096
a == c        => False

請閱讀有關浮點運算的文檔:問題和限制

https://docs.python.org/3/tutorial/floatingpoint.html

對於您的示例:

from decimal import Decimal
a='46700000000987654321'

b=Decimal(a)

print(b)    #46700000000987654321

c=int(b)

print(c)    #46700000000987654321

我對另一個問題的回答的修改版本(合理地)欺騙了這個問題:

發生這種情況是因為46700000000987654321大於 C double精度的 integer 表示限制(這是 Python float的實現依據)。

通常, C doubleIEEE 754 64 位二進制浮點值,這意味着它們具有 integer 精度的 53 位float可以表示的最后一個連續的 integer 值是2 ** 53 - 1后跟2 ** 53 ;它不能' t 表示2 ** 53 + 1 )。 問題是, 46700000000987654321需要 integer 精度的 66 位來存儲( (46700000000987654321).bit_length()將提供此信息)。 當一個值對於單獨的尾數(integer 組件)來說太大時,浮點值的指數組件用於按 2 的冪縮放較小的 integer 值,使其大致處於原始值的范圍內,但這意味着可表示的整數開始跳過,首先是 2(因為你需要 >53 位),然后是 4(對於 >54 位),然后是 8(>55 位),然后是 16(>56 位),等等,跳過對於超過 53 位的每個額外位,可表示值之間的距離是原來的兩倍。

在您的情況下,轉換為float46700000000987654321的 integer 值為46700000000987652096 (如您所述),在低位數字中丟失了精度。

如果您需要任意精確的以 10 為基數的浮點數學,請將您對float的使用替換為decimal.Decimal (方便的是,您的初始值已經是一個字符串,因此您不會冒輸入float和實際值之間精度損失的風險存儲的值); 默認精度將處理這些值,如果您需要更大的值,您可以增加它。 如果您這樣做(並將a轉換為int以進行比較,因為str永遠不等於任何數字類型),您將獲得預期的行為:

from decimal import Decimal as Dec, getcontext

a = "46700000000987654321"
b = Dec(a); print(b)  # => 46700000000987654321
c = int(b); print(c)  # => 46700000000987654321
print(int(a) == c)    # => True

在線試用!

如果您在交互式解釋器中回顯Decimal而不是使用print ,您會看到Decimal('46700000000987654321') ,這是Decimalrepr形式,但它在數字上是46700000000987654321 ,如果轉換為int ,或通過字符串化任何不使用repr的方法,例如print ,它都顯示為46700000000987654321

暫無
暫無

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

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