在Python文档它说:" %(模)运算符产生了由第二的第一个参数的除法的余数. "
所以给定
a % b
Run Code Online (Sandbox Code Playgroud)
据我所知,剩余部分是将A除以B均匀分开的数字.所以21%3 = 0,-25%23 = -2.我不明白的是当A为负时会发生什么.
例如,
-23 % 22
Run Code Online (Sandbox Code Playgroud)
会产量
21
Run Code Online (Sandbox Code Playgroud)
这是第一个正整数,它是一致的模数-1.但-1是剩余的-23%22.那么文档错了吗?Python中的模运算符%不会产生%b中的余数,而是与B一致的第一个正整数?我很困惑.
有三种不同的明显方法来定义负数的整数除法,以及三种相应的方法来定义余数:
所有这三个都保留了整数除法的基本定律:
dividend = divisor * quotient + remainder
Run Code Online (Sandbox Code Playgroud)
所以,三者中没有一个是"正确的"或"错误的".*
当然,这并不能阻止人们进行圣战.Knuth在"数学上正确"的基础上主张分裂.Wirth认为截断分裂是因为它"不那么令人惊讶".Raymond Boute认为整数除法是根据欧几里得算法定义的.我不会试图解决几十年前的圣战,他们争辩说他们三个人,包括两个最重要的人,都是错的......
有些语言通过两种不同的功能来解决这个问题.**
我们只是说Python选择了Knuth的定义,因此它的模数运算符具有除数的符号.
*当然,选择商和余数的非匹配定义是另一个故事.或者更糟糕的是,指定一个并保留其他实现定义,如C在C99之前所做的那样.
**这个特别有趣,因为它们并不总是一致的.至少当他们是所谓的rem和mod,rem是与云的一个div,同时mod是两者的地板或欧几里德不走div时,当他们是所谓的rem和remainder或mod和modulo...