2009-12-25 129 views
3

爲什麼-22/10在python中返回-3。任何關於此的指針都會對我有所幫助。Python中的浮點概念

+0

真實的大部分語言:C,C++,Java和C#等 – duffymo 2009-12-25 16:05:17

回答

5

PEP 238「改變部門操作員」,我認爲很好地解釋了這些問題。簡而言之:在設計Python時,它在整數之間採用了「截斷」的含義,僅僅是因爲大多數其他編程語言自從1957年第一個FORTRAN編譯器啓動以來一直都在使用(全大寫的語言名稱和全部;-)。 (一種普遍的語言沒有采用這個意思,使用/來產生浮點結果,div用於截斷,是Pascal)。

在2001年,它決定這個選擇不是最優的(引用PEP,「這使得表達式期望浮點或複雜結果容易出錯,當整數不是預期但可能作爲輸入時」),並切換到使用一個新的運算符//請求除法截斷,並更改/的含義以產生浮點結果(「真分度」)。

您可以明確地通過將聲明

from __future__ import division 

在一個模塊(命令行開關-Qpython解釋也可以控制部門的行爲)開始要求這種行爲。對於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來獲得浮點參數作爲一個理性的「最佳實用逼近」(當然,這可以掩模精度損失)。

10

因爲它默認是整數除法。整數除法向負無窮大方向舍入。請看:

>>> -22/10 
-3 
>>> -22/10.0 
-2.2000000000000002 

正:

>>> 22/10 
2 
>>> 22/10.0 
2.2000000000000002 

關於浮點的看似「不準確」,這是一個偉大的文章閱讀:Why are floating point calculations so inaccurate?

+0

爲什麼浮點計算如此不準確?有沒有關於這個的文件? – Chaitanya 2009-12-25 16:04:53

+0

更新回答您的評論 – 2009-12-25 16:06:34

+0

如果需要更高精度,請查看http://docs.python.org/library/decimal.html Python十進制模塊。 – SapphireSun 2009-12-25 23:44:45

2

因爲你正在做一個整數師。如果你做-22.0/10,你會得到正確的結果。

5

默認情況下,當兩個操作數都是整數時,當前版本的Python 2.x(我不確定關於3.x)給出了任何算術運算符的整數結果。但是,有一種方法可以改變這種行爲。

from __future__ import division 
print(22/10) 

輸出

2.2000000000000002 

當然,一個更簡單的方法是簡單地做一個操作數由前兩個答案中描述的浮動。

2

發生這種情況是因爲整數除法的操作返回數字,當乘以除數給出的最大可能整數不大於您劃分的數字。

這就是爲什麼22/10給出了2:10 * 2 = 20,這是10的最大整數倍不超過20

大當此去否定,你的操作變得-22/10。你的結果是-3。應用與前一種情況相同的邏輯,我們看到10 * -3 = -30,這是10的最大整數倍不大於-20。

這就是爲什麼你在處理負數時會得到一個意想不到的答案。

希望幫助