2017-06-13 62 views
0

我將通過實例解釋我的問題:樓功能是消除整數科學記數法,巨蟒

>>> #In this case, I get unwanted result 
>>> k = 20685671025767659927959422028/2580360422 
>>> k 
8.016582043889239e+18 
>>> math.floor(k) 
8016582043889239040 
>>> #I dont want this to happen ^^, let it remain 8.016582043889239e+18 
>>> #The following case though, is fine 
>>> k2 = 5/6 
>>> k2 
0.8333333333333334 
>>> math.floor(k2) 
0 

我如何math.floor不是地板的科學譜寫數字?是否有一個規則,哪些數字以科學記數法表示(我想這將是一定的界限)。


編輯

我首先想到的是,math.floor函數造成的精度損失,但事實證明,第一次計算自己失去了計算的精度,這有我真的很困惑,它可以很容易地在這裏看到:

>>> 20685671025767659927959422028/2580360422 
8016582043889239040 
>>> 8016582043889239040 * 2580360422 
20685671025767659370513274880 
>>> 20685671025767659927959422028 - 20685671025767659370513274880 
557446147148 
>>> 557446147148/2580360422 
216.0342184739958 
>>> ##this is >1, meaning I lost quite a bit of information, and it was not due to the flooring 

所以現在我的問題是如何得到實際的分裂結果。我看了下面的線程: How to print all digits of a large number in python? 但由於某種原因,我沒有得到相同的結果。


編輯: 我發現爲師準確性問題的簡單解決方案在這裏: How to manage division of huge numbers in Python? 顯然,//操作返回int而不是float,它沒有大小限制拆開機器的內存。

+0

_「我想這將是一個特定的邊界」_。我不這麼認爲。我剛剛輸入'99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999'到交互式提示符中,儘管比8e18大得多,它顯示了整個事情。 – Kevin

+0

@Kevin試圖用東西劃分它 – GoldenSpecOps

+0

這個符號只是一個數字的直觀表示。函數得到的參數是二進制表示,對於所有浮點數都是一樣的。 – DyZ

回答

3

在Python 3中,math.floor返回一個整數。整數不使用科學記數法顯示。一些花車代表使用科學記數法。如果您想要科學記數法,請嘗試將其轉換回浮動狀態。

>>> float(math.floor(20685671025767659927959422028/2580360422)) 
8.016582043889239e+18 

由於Tadhg麥當勞 - 延森表示,也可以用str.format得到科學記數法的整數的字符串表示:

>>> k = 20685671025767659927959422028/2580360422 
>>> "{:e}".format(k) 
'8.016582e+18' 

這可能,實際上,是不是轉換成更實用浮動。作爲一般的經驗法則,您應該根據所需的精度和範圍選擇一種數字數據類型,而不用擔心打印時的樣子。

+0

謝謝,它幫助我理解真正的問題,我只是編輯了這個問題 – GoldenSpecOps