阅读 236

浅谈py的负数除法

前言

这是我参与新手入门的第3篇文章。

众所周知,python是一种动态的,解释性,强类型语言。而js是动态,解释性,弱类型语言。 两种语言有很多类似,又有很多差异。本文简单介绍下负数取余的问题。

负数取余

不知道大家有没有遇到过负数除法和取余的时候,从直觉上来说,负数取余是没有物理意义的。 在这个问题上不同编程语言有不同的规定。

py计算结果

先来看看py运行%运算的结果。

image.png

7%3==1//嗯,大家都一样。

-7%3==2//emmmmmmmmmmmmm,难道是-7重复加3,加到正数为止,正好为2?。

-7%-3==-1//肿么肥事啊,

7%-3==-2 // 发生甚么事了啦,一直重复-3,小于0为止正好-2?


js计算结果

来看看浏览器控制台js的运行结果

image.png

在符号相同的情况下运算结果与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就很特立独行。虽然生产中可能遇不到这个问题,但还是可以了解下。

如有错误,欢迎指正。

文章分类
阅读
文章标签