2014-03-04 30 views
1

我写了一个crule1.py,如下所示。Python的一个奇怪的计算结果

def exp_rule1 (mu1, h, alpha): 
    return h**2/(4*mu1**2) 

然后我在解释器中运行它。我得到

Python 2.7.6 |Anaconda 1.9.1 (64-bit)| (default, Nov 11 2013, 10:49:15) [MSC v.1500 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 

Imported NumPy 1.8.0, SciPy 0.13.3, Matplotlib 1.3.1 
Type "scientific" for more details. 
>>> import crul1 as c1 
>>> c1.exp_rule1(1, 1, 0) 
0 

然后我将代码复制到解释器。结果是

>>> def exp_rule1 (mu1, h, alpha): 
...  return h**2/(4*mu1**2) 
... 
>>> exp_rule1(1, 1, 0) 
0.25 

这让我很困惑,我无法修复它。非常感谢您在此代码中指出问题。

+2

这两个实例运行python 2? – M4rtini

+0

定义“解释器”。你在'import cru1 as c1','c1.exp_rule1(1,1,0)'line的同一个shell中运行第二个? – delnan

+0

是的,我运行相同的shell。该版本是Python 2.7 –

回答

0

问题是你混合整数和浮游物。尝试拨打电话exp_rule1(1.0, 1.0, 0.0),您会得到正确的结果。只要确保函数的所有参数都是浮点数。

+0

非常感谢。 –

+1

但这两种情况似乎都以相同的方式混合整数和浮点数,不是吗? – delnan

+0

具体来说,你在做整数除法而不是浮点除法。对于整数,1/2是零,对于浮动是0.5。 – Hooked

2

在Python 2.x中,/返回一个整数值,如果它的两个操作数都是整数。作为一种特殊情况,如果n < dn/d都为0,则两者都是正数。

对于

def exp_rule1 (mu1, h, alpha): 
    return h**2/(4*mu1**2) 

要确保无论分子或分母是一个浮点值。一个简单的方法是将4设置为float而不是整数。

def exp_rule1 (mu1, h, alpha): 
    return h**2/(4.0*mu1**2) 

另一种解决方法是导入为/新的3.x的行为,这是始终返回浮点操作数无关。如果你这样做,取而代之的是用//代替你依赖整数除法的任何部分。

# This allows 1/2 to return 0.5 instead of 0 
from __future__ import division 
+0

谢谢。这非常有用。 –