Python的数学错误?

Jam*_*gan 77 python math python-2.7

刚开始使用Python,所以这可能是我的错误,但......

我正在尝试使用Python.我喜欢用它作为计算器,我正在慢慢地完成一些教程.

我今天遇到了一些奇怪的事情.我想找出2013*2013,但我写了错误的东西,写了2013*013,并得到了这个:

>>> 2013*013
22143
Run Code Online (Sandbox Code Playgroud)

我用我的计算器检查了,22143是错误的答案!2013*13应该是26169.

为什么Python给我一个错误的答案?我的旧卡西欧计算器不这样做......

wim*_*wim 137

由于八进制算术,013实际上是整数11.

>>> 013
11
Run Code Online (Sandbox Code Playgroud)

前导零013被解释为基数为8且1*8 1 + 3*8 0 = 11.

注意:此行为在python 3中更改.以下是PEP 3127特别合适的引用

整数的默认八进制表示对于不熟悉类C语言的人来说是无声的混淆.很容易无意中创建一个具有错误值的整数对象,因为'013'对于Python语言本身而言意味着'十进制11'而不是'十进制13',这不是大多数人将分配给这个文字的含义.

  • 为什么程序员总是混淆万圣节和圣诞节?因为DEC25 == OCT31!Nyuk nyuk nyuk. (97认同)
  • @JoeFrambach,`0`前缀后跟0 - **7**是八进制:) (16认同)
  • @JamesElegan:也许这就是为什么Python 3使`0123`语法非法并始终需要`0o123`的原因之一. (14认同)
  • 仁慈的独裁者第一次没有正确地从Lisp复制.这些事情必须大声清晰:#xFF,#o777,#b1011. (5认同)
  • 是的,"0"前缀后跟0-8是八进制.`0x`前缀后跟0-9a-f是十六进制. (3认同)
  • @JamesElegan:根本不是一个愚蠢的问题. (3认同)
  • ...和`0b`后跟'0-1`是二进制的. (2认同)

Dar*_*tle 36

01311由于前导0,因此是八进制整数文字(相当于十进制整数字面值).

>>> 2013*013
22143
>>> 2013*11
22143
>>> 2013*13
26169
Run Code Online (Sandbox Code Playgroud)

以八进制整数文字开头0并以十六进制整数文字开头是非常常见的(当然在大多数我熟悉的语言中)0x.由于您遇到的确切困惑,Python 3引发了一个SyntaxError:

>>> 2013*013
  File "<stdin>", line 1
    2013*013
           ^
SyntaxError: invalid token
Run Code Online (Sandbox Code Playgroud)

并要求无论是0o0O不是:

>>> 2013*0o13
22143
>>> 2013*0O13
22143 
Run Code Online (Sandbox Code Playgroud)

  • 非常欢迎你.正如我和@ wim的回答所指出的那样,Python社区正在尽其所能,以最大限度地减少使用Python 3的八进制文字的新手混淆.不过,这是一个非常好的事情要注意 - 你可以肯定你会遇到再次使用0前缀的八进制文字,无论是Python 2.X还是其他语言. (3认同)
  • PEP 3127在这方面略显有趣......例如"一个新的Python用户可能(目前)对延迟发现他的数字不能正常工作感到困惑,我们可以通过立即向他解释Python来修复它不喜欢前导零(希望有合理的信息!),或者我们可以将这种教学经验委托给Internet Explorer浏览器中的JavaScript解释器,并让他尝试在那里调试他的问题." (2认同)

Col*_*nic 7

Python的八进制文字的"前导零"语法是一个常见的问题:

Python 2.7.3
>>> 010
8
Run Code Online (Sandbox Code Playgroud)

在Python 3.x http://docs.python.org/3.0/whatsnew/3.0.html#integers中更改了语法


Kyl*_*and 5

这主要是扩展@Wim的答案,但Python表示使用某些前缀的整数文字的基础.如果没有前缀,整数将被解释为基数为10.使用"0x",整数将被解释为十六进制int.完整的语法规范在这里,虽然如果你不熟悉正式的语法有点麻烦:http://docs.python.org/2/reference/lexical_analysis.html#integers

该表基本上表示如果你想要一个长值(即一个超过正常int的容量的值),写下数字后跟字母"L"或"l"; 如果您希望以十进制数解释您的数字,请正常写入数字(不带前导0); 如果你想用八进制解释它,用"0","0o"或"0O"作为前缀; 如果你想要它的十六进制,前缀为"0x"; 如果你想要二进制文件,请在其前面添加"0b"或"0B".