findingsea's Studio.

Python异号除法需要注意的问题

Word count: 355 / Reading time: 2 min
2014/03/12 Share

Python在整型除法上的运算规则和别的语言不同,对于被除数和除数同号的情况下,大部分语言的处理方法都是相似的:计算结果向下取整。但对于被除数和除数异号的情况下,像Java,C++等语言采用向上取整,而Python仍然采用向下取整。这在有些应用场景上会产生和我们预期不同的结果。

对于同号的情况,大部分语言的处理方法都相似:

1
2
3
4
5
In [1]: 10 / 3
Out[1]: 3

In [2]: 1 / 100
Out[2]: 0

对于异号的情况,Python仍然采用向下取整:

1
2
3
4
5
In [3]: -10 / 3
Out[3]: -4

In [4]: -1 / 100
Out[4]: -1

而其他语言(Java,C++)的计算结果为-3和0。

这一点区别在LeetCode OJEvaluate Reverse Polish Notation体现地尤其明显。对于该题可采用如下策略:

1
2
if num1 * num2 <0:
result.append(-(-num1 / num2))

Evaluate Reverse Polish Notation完整的Python代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
# @param tokens, a list of string
# @return an integer
def evalRPN(self, tokens):
result = []
for i in range(len(tokens)):
tk = tokens[i]
if tk not in ['+', '-', '*', '/']:
result.append(int(tk))
else:
num2 = result.pop()
num1 = result.pop()
if tk == '+':
result.append(num1 + num2)
elif tk == '-':
result.append(num1 - num2)
elif tk == '*':
result.append(num1 * num2)
elif tk == '/':
if num1 * num2 <0:
result.append(-(-num1 / num2))
else:
result.append(num1 / num2)
return result[0]
CATALOG