深度理解取余/取模运算

日常编程经常会接触到取余/取模运算,那么计算机中取余/取模运算究竟是怎么定义的?

P1:四种"取整"方式

数学取整

1.1 向0取整

parseInt() 注意接受参数是string;所以调用该方法时存在类型转换

parseInt(3.141592654) // 3

1.2 向下取整

Math.floor() 不四舍五入

Math.floor(1.5555) // 1

1.3 向上取整

Math.ceil() 向上取整

Math.ceil(1.5555) // 2
Math.ceil(1.1555) // 2

1.4 四舍五入取整

Math.round()  四舍五入取整

Math.round(1.5555) //2
Math.round(1.4999) //1

P2:用公式理解"取模"

取模概念

如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r 且 0 ≤ r < d。其中,q 被称为商,r 被称为余数。

 运算符之 --- 取余运算 %

P3:“取余”和“取模”一样吗?

取整

取余:尽可能让商,进行向0取整。

取模:尽可能让商,向-∞方向取整。

C中 % ,本质其实是取余。
Python中 % ,本质其实是取模。

理解链:

对任何一个大于0的数,对其进行0向取整和-∞取整,取整方向是一致的。故取模等价于取余

对任何一个小于0的数,对其进行0向取整和-∞取整,取整方向是相反的。故取模不等价于取余

同符号数据相除,得到的商,一定是正数(正数vs正整数),即大于0!故,在对其商进行取整的时候,取模等价于取余。

P4:总结

  • 浮点数(或者整数相除),是有很多的取整方式的,0向取整、(正、负)无穷向取整、四舍五入取整…
  • 如果 a 和 d 是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r , q 为整数,且0 ≤ |r|< |d|。其中,q 被称为商,r 被称为余数
  • 在不同语言,同一个计算表达式,“取模”结果是不同的。我们可以称之为分别叫做正余数 和 负余数
  • 具体余数 r 的大小,本质是取决于商 q 的。而商,又取决于除法计算的时候,取整规则。
  • 取余 vs 取模:取余是尽可能让商,进行向 0 取整。取模是尽可能让商,向 -∞ 方向取整。
  • 参与取余的两个数据,如果同符号,取模等价于取余
  • 如果参与取余的两个数据符号不同,在C语言中(或者其他采用向0取整的语言如:C++,Java),余数符号,与被除数相同。(因为采用的向0取整)

猜你喜欢

转载自blog.csdn.net/weixin_48927323/article/details/127633144