前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 和 Python 关于 % 的那些坑

Java 和 Python 关于 % 的那些坑

作者头像
与你一起学算法
发布2021-03-23 12:14:46
4560
发布2021-03-23 12:14:46
举报
文章被收录于专栏:与你一起学算法

最近在使用 Python 语言的

\%

运算的时候,实际的结果和自己与预想的结果不太一样,特此记录一下。

取余运算是很多语言都支持的,比如说 C、C++、Java、Python 等,之前使用取余运算的时候,大部分情况下除数和被除数都是正整数,这时候呢,

\%

运算很符合自己的日常思维方式,但是碰到负数的情况,就和我之前理解的不一样了。

我们可以先看几个常规的案例:

Python3 常规操作

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

Python3 取模操作

代码语言:javascript
复制
public class Main {
    public static void main(String []args) {
        System.out.println("5 % 3 = " + (5 % 3));
        System.out.println("-5 % 3 = " + (-5 % 3));
        System.out.println("5 % -3 = " + (5 % -3));
        System.out.println("-5 % -3 = " + (-5 % -3));
    }
}

Java 取模操作

不知道你之前有没有注意过这个问题,看到 Java 和 Python3 不同的输出结果后,我是整个人都傻了。

然后我又去查了下

\%

操作的数学形式表达,就是

a\%b=a-n*b

,其中

n

a/b

的整数商。

关于这个整数商,就有讲究了,因为是不能完全整除的,因此就有一个是往0方向舍入,还是一个是往负无穷方向舍入。

这就引出了两个不用的数学定义:

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

Python

\%

运算采用的就是往负无穷方向逼近,也就是取模运算。

C、C++、Java

\%

运算采用的就是往 0 逼近,也就是取余运算。

因为当除数和被除数都是正整数的时候,负无穷的方向和 0 的方向是一致的,所以二者没有差异,但是当被除数或者除数中有一个是负数或者二者都是负数的时候,差异就会显现出来,大家在使用的时候需要注意。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 与你一起学算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档