专栏首页技术进阶之路% 不是取模运算符?

% 不是取模运算符?

为什么我问这个问题,因为我今天才发现不同语言中 % 的含义是不同的,因为我是主学 java 的,一直以为 % 就是取模,但是我错了。

这还要从一道题目说起:如图,为什么在 Python 中 -17 % 10 = 3

大家可以直接看下面的解释,他说的不完全对,最后会解释原因。

假设 r = a - n * [a / n],重点在 a / n,该怎么算,这里就是 -17/10,结果是-1.7,那么按照 -2 算还是按照 -1 算呢?

我们先留着不说,先来看一下取模和取余的区别:

  • 取余,遵循尽可能让商 向0靠近 的原则,fix()
  • 取模,遵循尽可能让商 向负无穷靠近 的原则,floor()

第一步:先求c = a / n,结果是 -2(向负无穷方向舍入) 和 -1(向0方向舍入);

第二步:计算模和余数的公式相同,但因 c 的值不同,求模时r = 3,求余时r = -7

总结:当a和n符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。当符号不一致时,结果不一样。求模运算结果的符号和n一致,求余运算结果的符号和a一致。

各个环境下 % 运算符的含义不同,比如 C/OC/C++Java 中为取余,而 Python 则为取模。

所以我们的疑惑就解开了,因为在 Python 中 % 是取模,而在 Java 中为求余。两者的区别就在于是往0取整(取余)还是负无穷取整(取模)。

为什么那个人的回答不全对呢?因为不是 Python 规定的向负无穷取整,而是取模运算就是往负无穷取整,在 Python 中 % 是取模运算,而在那几个语言中是取余运算。

个人理解,如有疏漏请指出。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式——六大设计原则

    有时候我们可以将一个复杂的接口拆成两个不同的接口,这两个接口承担着不同的责任,这就是依赖了单一职责原则;它的定义就是:应该有且仅有一个原因引起类的变更。

    wsuo
  • 思科模拟器:VLAN 的配置与分析

    (1) 了解什么是带内管理; (2) 熟练掌握如何使用telnet方式管理交换机; (3) 熟练掌握如何为交换机设置web方式管理; (4) 熟练掌握如何进入交...

    wsuo
  • 阿里云服务器搭建 Redis 集群

    此命令为部署 Redis 集群,如果本地的 docker 没有 redis 的镜像,那么他会先自动下载再部署。

    wsuo
  • 取模运算

    取余运算的c向0 方向舍入(fix()函数);而取模运算向负无穷方向舍入(floor()函数)。

    饶文津
  • 织云Lite发布:详解包管理核心能力

    织云Lite 是一款轻量型服务管理平台,聚焦织云核心能力包管理,提供标准化的应用打包操作,可连接持续集成系统,完成线上程序分发,轻松实现进程管理。

    织云平台团队
  • VUE 入门基础(5)

    五,Class 与 Style 绑定 绑定HTML class   对象语法     我们可以传给v-bind:class 一个对象,以动态的切换class  ...

    用户1197315
  • 《Effictive python》读书笔记2

    因为none值和0等,在判断语句中都类似false,可能跟正常情况冲突。python更推崇抛出异常的方式来处理特殊情况。所以异常情况可以直接抛出自定义的异常,让...

    J_J
  • Vue.js-Class与Style绑定 原

    (adsbygoogle = window.adsbygoogle || []).push({});

    tianyawhl
  • 如何成为顶级生物信息学家

    前几天去南京参加两年一度的全国大会CCBSB2014,今年是第六届,见到许多熟识的前辈和老朋友,也结识了不少新朋友。相比于两年前在哈尔滨开的第五届大会,参会人数...

    阿凡亮
  • Java - HashMap扩容为什么选用2倍

    夹胡碰

扫码关注云+社区

领取腾讯云代金券