爲什麼-22/10在python中返回-3。任何關於此的指針都會對我有所幫助。Python中的浮點概念
回答
PEP 238「改變部門操作員」,我認爲很好地解釋了這些問題。簡而言之:在設計Python時,它在整數之間採用了「截斷」的含義,僅僅是因爲大多數其他編程語言自從1957年第一個FORTRAN編譯器啓動以來一直都在使用(全大寫的語言名稱和全部;-)。 (一種普遍的語言沒有采用這個意思,使用/
來產生浮點結果,div
用於截斷,是Pascal)。
在2001年,它決定這個選擇不是最優的(引用PEP,「這使得表達式期望浮點或複雜結果容易出錯,當整數不是預期但可能作爲輸入時」),並切換到使用一個新的運算符//
請求除法截斷,並更改/
的含義以產生浮點結果(「真分度」)。
您可以明確地通過將聲明
from __future__ import division
在一個模塊(命令行開關-Q
到python
解釋也可以控制部門的行爲)開始要求這種行爲。對於x的所有值,缺少這樣的「從未來導入」(和命令行開關使用),Python 2.x,總是使用「經典分割」(即/
在int
之間截斷)。
但是,Python 3始終使用「真正的除法」(/
之間的int
產生float
)。
注意好奇的必然結果(在Python 3)...:
>>> from fractions import Fraction
>>> Fraction(1/2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/fractions.py", line 100, in __new__
raise TypeError("argument should be a string "
TypeError: argument should be a string or a Rational instance
因爲/
產生float
,它不是作爲參數Fraction
(否則精度可能會默默地丟失)可以接受的。您必須使用一個字符串,或傳遞分子和分母作爲單獨的參數:
>>> Fraction(1, 2)
Fraction(1, 2)
>>> Fraction('1/2')
Fraction(1, 2)
gmpy使用一種不同的,更寬容的方式建立mpq
S,它的等效的Python 3 Fraction
S的...:
>>> import gmpy
>>> gmpy.mpq(1/2)
mpq(1,2)
具體而言(參見線3168和在the source以下),gmpy使用Stern-Brocot tree來獲得浮點參數作爲一個理性的「最佳實用逼近」(當然,這可以掩模精度損失)。
因爲它默認是整數除法。整數除法向負無窮大方向舍入。請看:
>>> -22/10
-3
>>> -22/10.0
-2.2000000000000002
正:
>>> 22/10
2
>>> 22/10.0
2.2000000000000002
關於浮點的看似「不準確」,這是一個偉大的文章閱讀:Why are floating point calculations so inaccurate?
爲什麼浮點計算如此不準確?有沒有關於這個的文件? – Chaitanya 2009-12-25 16:04:53
更新回答您的評論 – 2009-12-25 16:06:34
如果需要更高精度,請查看http://docs.python.org/library/decimal.html Python十進制模塊。 – SapphireSun 2009-12-25 23:44:45
因爲你正在做一個整數師。如果你做-22.0/10,你會得到正確的結果。
默認情況下,當兩個操作數都是整數時,當前版本的Python 2.x(我不確定關於3.x)給出了任何算術運算符的整數結果。但是,有一種方法可以改變這種行爲。
from __future__ import division
print(22/10)
輸出
2.2000000000000002
當然,一個更簡單的方法是簡單地做一個操作數由前兩個答案中描述的浮動。
發生這種情況是因爲整數除法的操作返回數字,當乘以除數給出的最大可能整數不大於您劃分的數字。
這就是爲什麼22/10給出了2:10 * 2 = 20,這是10的最大整數倍不超過20
大當此去否定,你的操作變得-22/10。你的結果是-3。應用與前一種情況相同的邏輯,我們看到10 * -3 = -30,這是10的最大整數倍不大於-20。
這就是爲什麼你在處理負數時會得到一個意想不到的答案。
希望幫助
- 1. 概念:在Python
- 2. Python列表概念
- 3. python多態概念示例
- 4. 解決龜概念在Python
- 5. sqlite概念到coredata的概念?
- 6. 概念
- 7. 概念
- 8. 概念
- 9. OAuth2.0的概念
- 10. Threading.Tasks:WaitAll的概念()
- 11. Postfix的概念
- 12. MVC實現概念(概念(ABAP SAP)
- 13. 在GCC中解釋整數,字符和浮點指針的大小的概念
- 14. Python面向對象的設計概念
- 15. URL過期概念的Pro和缺點
- 16. xml站點地圖的概念
- 17. 關注WMQ同步點的概念
- 18. 瞭解SpriteKit節點的概念
- 19. Corona SDK中的「Throw」概念
- 20. 硒中的網格概念
- 21. HDFS中Hadoop塊的概念
- 22. C#3.0中的概念
- 23. C中的叉子概念#
- 24. SVN中包的概念
- 25. Aspectj在eclipse中的概念
- 26. 導軌中的TDD概念
- 27. WPF中的類概念
- 28. jpa中的繼承概念
- 29. makefile中的庫概念
- 30. MongoDB中的碎片概念
真實的大部分語言:C,C++,Java和C#等 – duffymo 2009-12-25 16:05:17