负数取余,取余和取模

简介: 负数取余,取余和取模

1.圆整

就是把一个小数或者说浮点数按某种规律近似为一个它左边或右边最近的一个整数。比如:

1.向负无穷圆整

   1.8->1
  1.2->1
 -0.4->-1
 -0.7->-1


2.向零圆整

1.6->1
1.2->1
-0.4->0
-0.7->0


3.四舍五入圆整

1.6->2
1.3->1
-0.2->0
-0.7->-1

在python有一个函数为round(),有点小特别,一般情况下为:

>>> round(1.2) 
1.0
>>> round(1.6)
2.0
>>> round(-0.2)
-0.0
>>> round(-0.7)
-1.0

好像还在在意料之中。

特例1:

#python 3
>>>round(3.5)
>>>4
>>>round(2.5)
>>>2


#python 2
>>> round(3.5)
4.0
>>> round(2.5)
3.0
>>> 

解析:


python2中如果浮点数距离两端一样远,则保留到离0远的一边。所以round(0.5)会近似到1,而round(-0.5)会近似到-1。


python3.5中如果距离两边一样远,会保留到偶数的一边。比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。

特例2:

#python 2 or python 3
>>> round(2.675,2)
2.67

后面的2表示要保留的小数位数,结果为什么不是2.68呢?


解析:


这跟浮点数的精度有关。我们知道在机器中浮点数不一定能精确表达,因为换算成一串1和0后可能是无限位数的,机器已经做出了截断处理。那么在机器中保存的2.675这个数字就比实际数字要小那么一点点。这一点点就导致了它离2.67要更近一点点,所以保留两位小数时就近似到了2.67。关于浮点数,并不是想象中那样简单,后面我会补充一篇相关文章。


到这里,对于python而言,我要说:

除非对精确度没什么要求,否则尽量避开用round()函数。或者选择其他方法。
1)使用math模块中的一些函数,比如math.ceiling(天花板除法)。
2)python自带整除,python2中是/,3中是//,还有div函数。
3)字符串格式化可以做截断使用,例如 "%.2f" % value(保留两位小数并变成字符串……如果还想用浮点数请披上float()的外衣)。
4)对浮点数精度要求如果很高的话,请用decimal模块。

2.取余与取模

  通常情况下,我们对取余和取模混为一谈,但是这两个是不一样的。在c、 c++ 、java、 python里面都是用%表示取模或者取余的,但是我们分别用这四门语言去计算-1%3这个式子发现结果并不一样,原因是在c、 c++、 java里面%表示取余,而在python里面%表示取模。而我开头提到的那本书直接将其混为一谈,越看越气。


  进行计算的两个数符号一样时,取余和取模的结果是一样的,因为符号一样时a/b总是非负数,那么a%b的结果自然也是一样的,这里不再讨论。


  在进行计算的两个数符号不一样时,取余和取模的结果是不一样的,究其原因是下面公式中在计算c的时候趋向不同。


  下面的式子中:c表示a/b的商的整数部分(虽然//表示取整,但用它来表示取余或者取模的商的整数部分是不合理的,此处仅仅作为一个记号使用),则r则为取余或者取模的结果。取余或者取余的不同指出就在与:c的取值不同,取余计算中c是向0取整,取模计算中c是向负无穷取整。

c=a//b;
a=c*b+r;

3.实例解析

先来几道题目给大家做做吧:

#分别计算下面4式取余和取模的结果
>>>  10 % 3
>>>  -10 % -3
>>>  -10 % 3
>>>> 10 % -3

先睡觉了,明天补上下文

相关文章
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
684 1
python知识点100篇系列(17)-替换requests的python库httpx
|
人工智能 小程序
【一步步开发AI运动小程序】五、帧图像人体识别
随着AI技术的发展,阿里体育等公司推出的AI运动APP,如“乐动力”和“天天跳绳”,使云上运动会、线上健身等概念广受欢迎。本文将引导您从零开始开发一个AI运动小程序,使用“云智AI运动识别小程序插件”。文章分为四部分:初始化人体识别功能、调用人体识别功能、人体识别结果处理以及识别结果旋转矫正。下篇将继续介绍人体骨骼图绘制。
|
机器学习/深度学习 数据采集 数据可视化
使用Python实现深度学习模型:智能废气排放监测与控制
使用Python实现深度学习模型:智能废气排放监测与控制
290 0
|
架构师 Java 程序员
3分钟通晓,互联网架构20年以来的演进
作为一个Java程序员,你可能也思考过,为什么我还是普通开发,为什么我还是高级开发,普通开发和高级开发有什么区别?你是不是也想过要成为架构师?想要成为合格的架构师,就必须要了解架构的演进,今天,我们就来聊一聊,Java架构的演变历史。
460 0
|
设计模式 前端开发 Java
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
文章详细介绍了中介者模式(Mediator Pattern),这是一种对象行为型模式,用于封装一系列对象的交互,降低系统耦合度,并简化对象之间的交互关系。通过案例分析、结构图、时序图和代码示例,文章展示了中介者模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
|
存储 缓存 算法
缓存优化利器:5分钟实现 LRU Cache,从原理到代码!
嗨,大家好!我是你们的技术小伙伴——小米。今天带大家深入了解并手写一个实用的LRU Cache(最近最少使用缓存)。LRU Cache是一种高效的数据淘汰策略,在内存有限的情况下特别有用。本文将从原理讲起,带你一步步用Java实现一个简单的LRU Cache,并探讨其在真实场景中的应用与优化方案,如线程安全、缓存持久化等。无论你是初学者还是有一定经验的开发者,都能从中受益。让我们一起动手,探索LRU Cache的魅力吧!别忘了点赞、转发和收藏哦~
721 2
|
C++ 容器
【C++】string类的使用①(迭代器接口begin,end,rbegin和rend)
迭代器接口是获取容器元素指针的成员函数。`begin()`返回首元素的正向迭代器,`end()`返回末元素之后的位置。`rbegin()`和`rend()`提供反向迭代器,分别指向尾元素和首元素之前。C++11增加了const版本以供只读访问。示例代码展示了如何使用这些迭代器遍历字符串。
|
前端开发 JavaScript 测试技术
【PHP开发专栏】PHP Web开发基础与流程
【4月更文挑战第29天】本文介绍了PHP Web开发的基础和流程,帮助初学者入门。内容包括Web服务器与PHP解释器的工作原理、HTML/CSS/JavaScript基础知识、PHP语法与数据库操作。开发流程涵盖项目规划、环境搭建、数据库设计、代码编写、测试与调试,以及部署与维护。此外,文中还强调了使用框架、代码组织、安全性及性能优化等进阶知识和最佳实践,旨在培养优秀PHP开发者。
352 0
|
C语言
【C语言】柔性数组(可变长数组)
【C语言】柔性数组(可变长数组)
|
安全 Ubuntu Shell
关于limits生效的四个案例
进程大量too many open file 的报错,修改/etc/security/limits.conf未生效
6017 0