首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改非正数除法的python数学模块行为

更改非正数除法的python数学模块行为
EN

Stack Overflow用户
提问于 2011-05-22 05:04:29
回答 3查看 509关注 0票数 5

非正数除法在c++和python编程语言中有很大的不同:

代码语言:javascript
复制
//c++:
11 / 3 = 3
11 % 3 = 2
(-11) / 3 = -3
(-11) % 3 = -2
11 / (-3) = -3
11 % (-3) = 2
(-11) / (-3) = 3
(-11) % (-3) = -2

所以,正如你所看到的,c++正在最小化商。然而,python的行为如下:

代码语言:javascript
复制
#python
11 / 3 = 3
11 % 3 = 2
(-11) / 3 = -4
(-11) % 3 = 1
11 / (-3) = -4
11 % (-3) = -1
(-11) / (-3) = 3
(-11) % (-3) = -2

我不能像c++那样编写自己的除法函数,因为我将使用它来检查c++计算器程序,而python不支持中缀运算符。我可以让python的行为像c++一样,同时以一种简单的方式除以整数吗?例如,设置一些标志或类似的东西?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-22 05:37:10

正如Thomas K所说,使用math.fmod表示模,或者如果你真的想要,你可以自己定义它:

代码语言:javascript
复制
def cmod(x, y):
    return abs(x) % abs(y) * (1 if x > 0 else -1)

这个函数应该模拟C风格的除法:

代码语言:javascript
复制
def cdiv(x, y):
    return abs(x) / abs(y) * cmp(x, 0) * cmp(y, 0)

您说过您必须使用/%运算符。这是不可能的,因为你不能覆盖-in的运算符。但是,您可以定义自己的整数类型和运算符重载__div____mod__运算符。

票数 3
EN

Stack Overflow用户

发布于 2011-05-22 05:48:35

没有可以设置的标志来使python division像c++一样工作。

您建议您不能编写自己的除法函数,但如果您改变主意,您可以这样做:

代码语言:javascript
复制
def cpp_int_div(dividend, divisor):
    a, b = dividend, divisor
    sign = 1 if (a>0 and b>0) or (a<0 and b<0) else -1
    return (abs(a)/abs(b)) * sign

def cpp_int_mod(dividend, divisor): # or just use math.fmod  (from Thomas K)
    a, b = dividend, divisor
    sign = 1 if a>0 else -1
    return (abs(a)%abs(b)) * sign

这表明它是根据您的规范运行的:

代码语言:javascript
复制
print "11 / 3 = %d" % cpp_int_div(11,3)
print "11 %% 3 = %d" % cpp_int_mod(11,3)
print "(-11) / 3 = %d" % cpp_int_div(-11, 3)
print "(-11) %% 3 = %d" % cpp_int_mod(-11, 3)
print "11 / (-3) = %d" % cpp_int_div(11, -3)
print "11 %% (-3) = %d" % cpp_int_mod(11, -3)
print "(-11) / (-3) = %d" % cpp_int_div(-11, -3)
print "(-11) %% (-3) = %d" % cpp_int_mod(-11, -3)

这就给出了:

代码语言:javascript
复制
11 / 3 = 3
11 % 3 = 2
(-11) / 3 = -3
(-11) % 3 = -2
11 / (-3) = -3
11 % (-3) = 2
(-11) / (-3) = 3
(-11) % (-3) = -2
票数 2
EN

Stack Overflow用户

发布于 2011-05-22 06:01:16

您还应该从标准库中检出模块。

十进制“是基于一个浮点模型,这个模型是以人为本设计的,并且必然有一个最重要的指导原则--计算机必须提供一个与人们在学校学习的算法工作方式相同的算法。”-摘自十进制算术规范。

然而,结果是

代码语言:javascript
复制
import decimal
decimal.divmod(-11, 3)
>>> (-4, 1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6084438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档