Python Go中负整数的模
我目前正在学习GoLang,我来自Python背景 最近,我偶然发现了Python Go中负整数的模,python,go,modulo,Python,Go,Modulo,我目前正在学习GoLang,我来自Python背景 最近,我偶然发现了%(模)操作符的一个行为,它与Python中相应的操作符不同。与和余数的定义相反,负整数乘以正整数的模返回负值 例如: python 输出: 1 2 0 1 2 0 1 2 0 1 -2 -1 0 -2 -1 0 1 2 0 1 去 在阅读了有关这些差异的内容,并被问及这些差异背后的原因后,我了解到这些差异是由于相关语言的设计目标造成的 问题1。我想知道为什么在这里Go遵循C/C++协议而不是Python。任何相关讨论的链
%
(模)操作符的一个行为,它与Python中相应的操作符不同。与和余数的定义相反,负整数乘以正整数的模返回负值
例如:
python
输出:
1
2
0
1
2
0
1
2
0
1
-2
-1
0
-2
-1
0
1
2
0
1
去
在阅读了有关这些差异的内容,并被问及这些差异背后的原因后,我了解到这些差异是由于相关语言的设计目标造成的
问题1。我想知道为什么在这里Go遵循C/C++协议而不是Python。任何相关讨论的链接都会有所帮助
问题2。Go中是否有一个内置功能可以复制Python的模运算?备选方案:是否有计算“模数”而不是“余数”的内部方法?参见: 目前的定义有几个原因:
- 由于x86体系结构的缘故,%的当前语义直接可用
- 更改基本运算符%的含义而不更改其名称会使人困惑
- 根据%的结果计算另一个模量相当容易
func-modLikePython(d,m int)int{
var res int=d%m
if((res<0&&m>0)| |(res>0&&m<0)){
返回res+m
}
返回res
}
请注意,在Python中,
5%-3
是-1
,此代码也复制了该行为。如果您不想这样做,请删除If
语句中|
之后的第二部分。Python是一种特殊的语言,Guido Guido van Rossum是。以下是他为什么决定与众不同的解释:
您的第二季度
是否有计算“模数”而不是“余数”的内部方法
上面的答案引用的评论
请注意,%计算的是“余数”,而不是“模数”
有点误导
查阅“模”的任何定义,大体上都会说它是除法后的余数。问题是,当我们说“余数”时,它意味着只有一个余数。当涉及负数时,可以有多个不同的余数。在的Wikipedia页面上,它区分了最小正余数
和最小绝对余数
。您还可以添加一个最小负数余数
(最小负数表示负数,但最接近0)
通常,对于模运算符,如果返回正值,则为最小正余数
;如果返回负值,则为最小负余数
。返回值的符号可以通过多种方式确定。例如,给定c=a mod b
,您可以将c
的符号定义为
- a的符号(Go中的
功能)%
- b的符号(Python中
的功能)%
- 非负始终
%
操作符
func mod(a, b int) int {
return (a % b + b) % b
}
重申一下,这是遵循规则的
给定c=a mod b
,c
的符号将是b的符号。
或者换句话说,模结果与除数具有相同的符号
谢谢你的推荐。这个问题已经结束了,我没有注意到。我将更新我的问题以反映这一点。您可以将转到Python模块的代码简化为:
(I%n)+n)%n
。已验证我不确定是否存在特殊性,ruby
和lua
的行为方式相同。
-2
-1
0
-2
-1
0
1
2
0
1
func mod(a, b int) int {
return (a % b + b) % b
}