Python Go中负整数的模

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。任何相关讨论的链

我目前正在学习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。任何相关讨论的链接都会有所帮助

问题2。Go中是否有一个内置功能可以复制Python的模运算?
备选方案:是否有计算“模数”而不是“余数”的内部方法?参见:

目前的定义有几个原因:

  • 由于x86体系结构的缘故,%的当前语义直接可用
  • 更改基本运算符%的含义而不更改其名称会使人困惑
  • 根据%的结果计算另一个模量相当容易
请注意,%计算的是“余数”,而不是“模数”

标准库中没有复制Python模运算的运算符或函数

可以编写一个复制Python模运算的函数:

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中
    %
    的功能)
  • 非负始终
下面是用这种方式定义的编程语言及其模实现的列表

无论如何,这里有一种无分支的方法,可以用Go函数复制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
}