前言
众所周知,python是一种动态的,解释性,强类型语言。而js是动态,解释性,弱类型语言。 两种语言有很多类似,又有很多差异。本文简单介绍下负数取余的问题。
负数取余
不知道大家有没有遇到过负数除法和取余的时候,从直觉上来说,负数取余是没有物理意义的。 在这个问题上不同编程语言有不同的规定。
py计算结果
先来看看py运行%运算的结果。
7%3==1//嗯,大家都一样。
-7%3==2//emmmmmmmmmmmmm,难道是-7重复加3,加到正数为止,正好为2?。
-7%-3==-1//肿么肥事啊,
7%-3==-2 // 发生甚么事了啦,一直重复-3,小于0为止正好-2?
js计算结果
来看看浏览器控制台js的运行结果
在符号相同的情况下运算结果与py相同,但除法与被除数异号居然不一样!!!
分析
从形式上找规律,py中的余数的符号与除数一致,而js中结果与被除数的符号保持一致。
这两种差异,实际上来自于他们对除法的规定不同。余数=被除数-(被除数/除数)x除数。因为商不同,所以余数不同。
有2种除法模式:
- floor除法,商采用floor法取整,趋负无穷截尾。python采用这种。
例子中:-7%3中,商为-2.333333,向下取整得-3,所以模就为-7 -(-3)x 3 => -7 -(-9)==2.
- truncate 除法,商尽可能的向0靠近。多数编程语言如C、java还有js等采用这种方案。 -7%3,商-2.333333靠近0取整得-2,所以余数为-7-(-6)==-1.
好了,以这种计算模式去看,完全能解释通了。
总结
总结py就很特立独行。虽然生产中可能遇不到这个问题,但还是可以了解下。
如有错误,欢迎指正。