#2020学习打卡##C程序设计语言# 为什么C语言中%取模运算只能用整数?

已邀请:

zkbhj - 凯冰科技站长

赞同来自:

我们先明确下什么叫取模运算?


取模运算(“Modulus Operation”)和取余运算(“Remainder Operation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中。取余则更多是数学概念。


所以取模,其实和取余基本上雷同,只是负整数运算时操作不同。所以,再看下余数的数学定义:


余数指整数除法中被除数未被除尽部分,且余数的取值范围为0到除数之间(不包括除数)的整数。 例如:27除以6,商数为4,余数为3。


带余除法的定义:


一个整数除以另一个不为零的整数,得到整数商后还有余数,这样的除法叫做“带余除法”。


看来,“带余除法”是定义在自然数集上的一种运算。只要除数不为零,不完全商和余数都存在,并且都是唯一的。
 
所以,%取模运算规定,两边的操作数据必须为整数,不能是float或者是double类型。
 
但是,真的就没有小数计算余数的概念吗?答案是有的。那就需要看一下“不完全商”的概念了!


当a÷b不能得到整数商时,如果a最多包含q个b,也就是说,a大于qb而小于(q+l)b,即当qb时,那么这个整数q叫做不完全商,而a与qb的差叫做余数。


 
所以如果能够厘清不完全商和带余除法这两个概念的定义范围,这个难题就可以迎刃而解。从上述内容可以看出,不完全商和带余除法是分别定义在不同集合上的两个概念。带余除法是在数论中作的定义,仅限于自然数范围;而不完全商是在有理数范围内作的定义,在这个定义域之内,除不完全商为整数、除数不为0外,被除数、除数和余数还可为小数。 
因此,在研究小数除法是否有余数这一问题时,如果不考虑数的范围,简单地给一个“有”或“无”的结论都是不够严密和科学的。我们可以通过两个角度来理解小数除法中的余数。一,按不完全商定义来理解,余数可以为小数;二,因为计算除数是小数的除法时,先要将除数转化成整数进行计算,因此,我们还可以理解为小数除法借用了整数带余除法中余数的概念。在利用商不变规律把小数除法转化成整数除法进行计算时,不完全商不变,但余数要和除数同时扩大相同的倍数。因此,要得到原来的余数,还要缩小相同的倍数。
 
C语言中也提供了针对非整数类型的取模计算的库函数:fmode(x,y),位于math.h标准头文件中。
 
double fmod(double x, double y)
x -- 代表分子的浮点值。
y -- 代表分母的浮点值。
该函数返回 x/y 的余数。

9.200000 / 2 的余数是 1.200000
9.200000 / 3.700000 的余数是 1.800000
以上内容参考了张维国发表于2012年《小学数学参考》数学版第三期的论文内容。
论文地址:http://www.cnki.com.cn/Article ... 1.htm

要回复问题请先登录注册