什么是取整?有几种取整方式?C语言又是哪种方式?取模取余一样吗?

您所在的位置:网站首页 05取整 什么是取整?有几种取整方式?C语言又是哪种方式?取模取余一样吗?

什么是取整?有几种取整方式?C语言又是哪种方式?取模取余一样吗?

#什么是取整?有几种取整方式?C语言又是哪种方式?取模取余一样吗?| 来源: 网络整理| 查看: 265

   大家都知道取整这回事,但是对于取整只有单一的认识,请看下面代码。 int main() { int j = -2.9; int i = 2.9; printf("%d\n", j); printf("%d\n", i); return 0; }

 看这串代码我们先不管数据溢出的问题,直接看最后的结果等于 什么

大家都知道最后结果会是-2.9变成-2,2.9变成2.

但是为什么会这样呢?我相信比较多人是不知道的

是因为一共有四种取整方式

第一种取整模式:向0取整

我们C语言默认是向0取整所以才等于这个结果

向0取整的意思是:只要你不是整数就把余数抹掉,变成整数。不是我们理解的四舍五入。

C语言里面有一个函数是和向0取整是一样作用,trunc函数。看代码

#define _CRT_SECURE_NO_WARNINGS #include #include//使用trunc这个函数要调用这个库函数 int main() { int j = -2.9; int i = 2.9; printf("%d\n", (int)trunc(j));//因为trunc这个函数返回的是浮点数,所以要强转成int printf("%d\n", (int)trunc(i)); return 0; }

 如图所示,是一摸一样的。

第二种取整模式:负无穷取整,floor取整

负无穷取整的意思是:只要是负数有余数就进一位,正数和向0取整一样

代码验证

#define _CRT_SECURE_NO_WARNINGS #include #include//使用trunc这个函数要调用这个库函数 int main() { printf("%lf\n",floor(-2.1)); printf("%lf\n",floor(-2.9)); printf("%lf\n", floor(2.1)); printf("%lf\n", floor(2.9)); return 0; }

 因为是负无穷取整-2.1和-2.9变成-3.0,正数2.1和2.9是向0取整的原则变成了2.0

第三种取整方式:向正无穷取整,ceil取整

正无穷取整模式:正数只要有余数就进1,负数和向0取整

代码验证

#define _CRT_SECURE_NO_WARNINGS #include #include//使用trunc这个函数要调用这个库函数 int main() { printf("%lf\n",ceil(-2.1)); printf("%lf\n",ceil(-2.9)); printf("%lf\n",ceil(2.1)); printf("%lf\n",ceil(2.9)); return 0; }

因为是正无穷取整2.1和2.9都有余数所以进1变成了3.0,-2.1和-2.9 一样是向0取整的原则等于2.0

第四种取整方式:四舍五入取整,round取整

四舍五入模式:就是我们数学进位用的那个

代码验证

#define _CRT_SECURE_NO_WARNINGS #include #include//使用trunc这个函数要调用这个库函数 int main() { printf("%lf\n",round(-2.1)); printf("%lf\n",round(-2.9)); printf("%lf\n",round(2.1)); printf("%lf\n",round(2.9)); return 0; }

四舍五入-2.1余数不是四以上所以等于-2.0,-2.9余数大于4所以进1等于-3.0,2.1和-2.1一样,2.9和-2.9一样 

四种取整方式的汇总代码

#define _CRT_SECURE_NO_WARNINGS #include #include//使用trunc这个函数要调用这个库函数 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)); return 0; }

 

 我们从图可以看见,有的取整方式不同但是最后取整结果有的是相同的

大家在这里可能就会想了,为什么要有那么多种取整方式。难道是和大小端一样?吃鸡蛋先吃大头还是小头一样?

其结果其实是各有各的用处,比如负无穷取整,像女孩子都希望自己年龄小点,女孩子实在要回答年龄的话,17岁9个月,都会回答成17岁。

像正无穷取整,有的年轻人有本事坐上了领导这个位置,怕年龄小,服不了底下员工,所以会把年龄取大点。

这些东西就不多聊了

我们来聊聊取模

为什么这里会等于1呢? 难道是10/3剩余1,所以等于1吗?

不对哦!!!取模和取余是有区别的哦

我们用取模简单公式来分析下结果

取模的基本概念

如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r 且0 ≤ r < d。其中,q 被称为商,r 被称为余数。

我们来带入一下公式,我们来求10%3的模

因为:a=10,d=3,q=3,r=1 0



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3