深入理解取整、取余与取模问题
目录
1. 取整问题
1.0向取整(C语言默认的取整方案)
2.地板取整(向负无穷的方向取整)
3.天花板取整(向+无穷的方向取整)
4.四舍五入取整
汇总例子
2.取模问题
1.余数的定义
2.两种余数
3.为什么会有这种现象?
3.区分取余与取模
1.取余与与取模的本质区别
2.理解链
3.同符号与不同符号
1.同符号:
2.不同符号
1. 取整问题
1.0向取整(C语言默认的取整方案)
#include<stdio.h> #include<windows.h> int main() {//本质是向0取整//trunc()函数也有这种作用,不过返回值是浮点数,而且必须引用math.h头文件int i = -2.9;int j = 2.9;printf("%d\n", i); //结果是:-2printf("%d\n", j); //结果是:2system("pause");return 0; }
2.地板取整(向负无穷的方向取整)
#include <stdio.h> #include <math.h> //因为使用了floor函数,需要添加该头文件 #include <windows.h> int main() {//本质是向-∞取整,注意输出格式要不然看不到结果printf("%.1f\n", floor(-2.9)); //-3printf("%.1f\n", floor(-2.1)); //-3printf("%.1f\n", floor(2.9)); //2printf("%.1f\n", floor(2.1)); //2system("pause");return 0; }
注意:使用floor()函数需要引头文件,参数为double 类型。返回值也同样为double类型。同时不要忘了引math.h头文件。
注意:python默认的取整方案就是地板取整,后面也正是因为这个原因,才出现了取模的不同!
3.天花板取整(向+无穷的方向取整)
#include <stdio.h> #include <math.h> #include <windows.h> int main() {//本质是向+∞取整,注意输出格式要不然看不到结果printf("%.1f\n", ceil(-2.9)); //-2printf("%.1f\n", ceil(-2.1)); //-2printf("%.1f\n", ceil(2.9)); //3printf("%.1f\n", ceil(2.1)); //3system("pause");return 0; }
注意:使用ceil()函数需要引头文件,参数为double 类型。返回值也同样为double类型。同时不要忘了引math.h头文件。
4.四舍五入取整
#include <stdio.h> #include <math.h> #include <windows.h> int main() { //本质是四舍五入 printf("%.1f\n", round(2.1)); printf("%.1f\n", round(2.9)); printf("%.1f\n", round(-2.1)); printf("%.1f\n", round(-2.9)); system("pause"); return 0; }
注意:使用round()函数需要引头文件,参数为double 类型。返回值也同样为double类型。同时不要忘了引math.h头文件。
汇总例子
#include <stdio.h> #include <math.h> #include <windows.h> int main() {const char* format = "%.1f \t%.1f \t%.1f \t%.1f \t%.1f\n";printf("value\tround\tfloor\tceil\ttrunc\n");printf("-----\t-----\t-----\t----\t-----\n");printf(format, 2.3, round(2.3), floor(2.3), ceil(2.3), trunc(2.3));printf(format, 3.8, round(3.8), floor(3.8), ceil(3.8), trunc(3.8));printf(format, 5.5, round(5.5), floor(5.5), ceil(5.5), trunc(5.5));printf(format, -2.3, round(-2.3), floor(-2.3), ceil(-2.3), trunc(-2.3));printf(format, -3.8, round(-3.8), floor(-3.8), ceil(-3.8), trunc(-3.8));printf(format, -5.5, round(-5.5), floor(-5.5), ceil(-5.5), trunc(-5.5));system("pause");return 0; }
2.取模问题
1.余数的定义
余数的定义:如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r , q 为整数,且0 ≤ |r|< |d|。其中,q 被称为商,r 被称为余数。
注意:余数并不一定都是正数,大家一定要牢记这个概念!
2.两种余数
由定义可知:
-10%3=-1------>-10/3=-3------->3*(-3)+(-1)=(-10)(C语言中是这样的)
-10%3=2------->-10/3=-4------->4*(-3)+ 2=(-10)(python环境中是这样的)
解释C: -10 = (-3) * 3 + (-1)(负余数)
解释Python:-10 = (?)* 3 + 2,其中,可以推到出来,'?'必须是-4,即-10 = (-4)* 3 + 2,才能满足定义。(正余数)
所以,在不同语言,同一个计算表达式,负数“取模”结果是不同的。我们可以称之为分别叫做正余数和负余数。
3.为什么会有这种现象?
由上面的例子可以看出,具体余数r的大小,本质是取决于商q的。
而商,又取决谁呢?取决于除法计算的时候,取整规则。
C语言中默认是0向取整,python中默认是-无穷的方向取整。
3.区分取余与取模
1.取余与与取模的本质区别
取余:尽可能让商,进行向0取整。
取模:尽可能让商,向负无穷方向取整。
所以:
C中%,本质其实是取余。
Python中%,本质其实是取模。
2.理解链
对任何一个大于0的数,对其进行0向取整和负无穷取整,取整方向是一致的。故取模等价于取余。其实这也是为什么我们常常会认为取模以取余是一码事的原因所在。
对任何一个小于0的数,对其进行0向取整和负无穷取整,取整方向是相反的。故取模不等价于取余。
3.同符号与不同符号
1.同符号:
同符号数据相除,得到的商,一定是正数,即大于0! 故,在对其商进行取整的时候,取模等价于取余。(倘若从数学上理解,就是简单的在负数的前面加一个绝对值即可)
2.不同符号
#include<stdio.h> #include <windows.h> int main() {printf("%d\n", -10 / 3); //结果:-3printf("%d\n\n", -10 % 3); //结果:-1 为什么? -10=(-3)*3+(-1)printf("%d\n", 10 / -3); //结果:-3printf("%d\n\n", 10 % -3); //结果:1 为什么?10=(-3)*(-3)+1system("pause");return 0; }
从上面可以看出:
被除数为负数时,取余后为负号。
除数为负数时,取余后为正数。
不同符号在C语言中虽然也有一定的规律,但我并不希望大家利用这个规律,而是利用定义老老实实的计算,毕竟这这是针对C语言的结论,在python中就不适用了,因为二者的取整方式是不同的。
深入理解取整、取余与取模问题相关推荐
- 向上取整、向下取整与四舍五入(易理解版)
关于取整.四舍五入 取整 向上取整 向下取整 四舍五入 关于向上取整和向下取整,一直有点晕晕的 特写一篇文章总结一下: 取整 分向下取整.向上取整 如上图所示,可以这么理解:数值处于两个整数之间, 向 ...
- python取整求余
python取整求余 / 表示除法 // 表示除后取整 % 表示除后求余 i = 15 a = i/2 b = i//2 c = i%2 print(a,b,c) 输出: 7.5 7 1
- python中取整求余的计算步骤
预备知识:取整分为向上取整.向下取整.向零取整. 首先必须知道 x%y等价于x-(( x//y ) * y ) ,这就是一个公式!! 这个x//y意思是x对y取整 比如python中(是向下取整, ...
- 向上取整和向下取整(ceil、round)
Floor and ceiling functions - Wikipedia Useful Properties of the Floor and Ceil Functions 0. 基础 向上取整 ...
- 截断 四舍五入 进位php,PHP取整,四舍五入取整、向上取整、向下取整、小数截取 四舍五入是什么意思 四舍五入就是一个亿 excel数值四舍五...
PHP取整数函数常用的四种方法: 1.直接取整,舍弃小数,保留整数:intval(): 2.四舍五入取整:round(): 3.向上取整,有小数就加1:ceil(): 4.向下取整:floor(). ...
- Oracle四舍五入,向上取整,向下取整
用oracle sql对数字进行操作: 取上取整.向下取整.保留N位小数.四舍五入.数字格式化取整(向下取整): select floor(5.534) from dual; select trunc ...
- #python计算结果百位500向下取整,(0-499取000,500-999取500)
!/usr/bin/env python coding:utf-8 计算结果百位500向下取整,(0-499取000,500-999取500) import math calc_Amount = fl ...
- (4.14)向上取整、向下取整、四舍五入取整的实例
Sql Server 里的向上取整.向下取整.四舍五入取整的实例! 2012年12月31日 07:33:43 阅读数:102170 ================================== ...
- x / k向上取整转换为向下取整
有的时候需要向上取整,一般的做法是直接判断余数是否等于0来决定是否需要加1,其实我们可以使用下面的公式将向上取整转换为向下取整: if __name__ == '__main__':x, k = 10 ...
- JAVA Math函数向上取整和向下取整
JAVA Math函数向上取整和向下取整, 向上取整用Math.ceil(double a) 向下取整用Math.floor(double a) 举例: double a=35; double b=2 ...
最新文章
- 计算机类自主招生推荐信,自主招生推荐信范文-20210709232503.docx-原创力文档
- 要啥给啥的写作AI:新闻评论小说都能编,题材风格随便选,真假难辨,16亿参数模型已开源...
- Java EE 8 MVC:使用表单参数
- 论文笔记 | Counterfactual Samples Synthesizing for Robust VQA
- Android 文件的上传
- aliyun maven 添加jar_Maven介绍及安装
- DB2数据库指定时间点恢复案例
- react-native ios push 本地view
- Spring MVC 常用注解
- 【服务器正在运行中】以及【切换到】等错误问题的解决
- java;break语句
- 基于AI分子力场模拟分子动力学
- ccf201503-1 ccf 图像旋转-内存限制问题
- C#引用win32API
- 计算机网络自顶向下第四章:网络层
- java跳格子不同跳发_(算法)跳格子
- 白杨SEO:你愿意和我用五年做一件事吗?白杨流量汇,与流量实战派一起向前
- 《黄帝内经.通天》阴阳五种类型的人
- 云呐|固定资产报废如何处理(固定资产报废如何处理残值)
- 西澳计算机专业世界排名,2015年西澳大学全球大学综合排名