运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

大佬告诉你Java 和 Python 关于 % 的那些坑

运维开发网 https://www.qedev.com 2021-05-09 11:39 出处:51CTO 作者:wx609644ba305e9
大佬告诉你Java 和 Python 关于 % 的那些坑,wx609644ba305e9的博客原创的Python文章。

 

最近在使用 Python 语言的 \%% 运算的时候,实际的结果和自己与预想的结果不太一样,特此记录一下。 取余运算是很多语言都支持的,比如说 C、C++、Java、Python 等,之前使用取余运算的时候,大部分情况下除数和被除数都是正整数,这时候呢,\%% 运算很符合自己的日常思维方式,但是碰到负数的情况,就和我之前理解的不一样了。 我们可以先看几个常规的案例:

大佬告诉你Java 和 Python 关于 % 的那些坑

这都是很正常的,但是如果除数和被除数中有一个负数或者两个都是负数的时候,问题就变得有点麻烦了。

大佬告诉你Java 和 Python 关于 % 的那些坑

大佬告诉你Java 和 Python 关于 % 的那些坑

大佬告诉你Java 和 Python 关于 % 的那些坑

不知道你之前有没有注意过这个问题,看到 Java 和 Python3 不同的输出结果后,我是整个人都傻了。 然后我又去查了下 %\%% 操作的数学形式表达,就是 a%b=a−n∗ba\%b=a-n*ba%b=a−n∗b,其中 nnn 是 a/ba/ba/b 的整数商。 关于这个整数商,就有讲究了,因为是不能完全整除的,因此就有一个是往 0 方向舍入,还是一个是往负无穷方向舍入。 这就引出了两个不用的数学定义:

  • 取模运算:往负无穷方向逼近

  • 取余运算:往 0 逼近

Python %\%% 运算采用的就是往负无穷方向逼近,也就是取模运算。 而 C、C++、Java %\%% 运算采用的就是往 0 逼近,也就是取余运算。 因为当除数和被除数都是正整数的时候,负无穷的方向和 0 的方向是一致的,所以二者没有差异,但是当被除数或者除数中有一个是负数或者二者都是负数的时候,差异就会显现出来,大家在使用的时候需要注意。

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号