[英]Cast float to int in Python results wrong answer
我有一個正在計算的算法:
result = int(14949283383840498/5262*27115)
正確的結果應該是 77033412951888085,但是 Python3.8 給了我 77033412951888080
我也嘗試了以下方法:
>>> result = 77033412951888085
>>> print(result)
77033412951888085
>>> print(int(result))
77033412951888085
>>> print(float(result))
7.703341295188808e+16
>>> print(int(float(result)))
77033412951888080
當我將浮點數轉換為 int 時,問題似乎出現了。 我錯過了什么?
PS:我發現使用result = 14949283383840498//5262*27115
我得到了正確的答案!
浮點運算在精度方面有局限性。 見https://docs.python.org/3/tutorial/floatingpoint.html
嘗試整數除法以保持使用整數的計算。
result = 14949283383840498//5262*27115
print(result)
輸出:
77033412951888085
您還可以使用默認使用 28 位精度的小數模塊。
from decimal import Decimal
result = Decimal(14949283383840498) / 5262 * 27115
print(result)
輸出:
77033412951888085
這是一個精度限制:
result = 14949283383840498/5262*27115
result
7.703341295188808e+16
在這種情況下,結果是一個浮點數。 您可以看到精度為 15 位。 將其轉換為 int,您會看到最后一個非零數字是 8,結果是正確的:打印時顯示浮點數。
請嘗試以下操作:
print(sys.float_info.dig)
15
dig 是可以在浮點數中忠實表示的最大十進制數字數。
關於這個問題的一個很好的解釋可以在這里找到。
但是有一些方法可以用 Python 做得更好,參見 Python 的文檔:
對於需要精確十進制表示的用例,請嘗試使用實現適用於會計應用程序和高精度應用程序的十進制算術的十進制模塊。
分數模塊支持另一種形式的精確算術,該模塊實現基於有理數的算術(因此像 1/3 這樣的數字可以精確表示)。
如果您是浮點運算的重度用戶,您應該查看 SciPy 項目提供的 NumPy 包和許多其他用於數學和統計運算的包
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.