数学中的余数概念一般限定在整数范围,因为实数范围的余数在数学上用处有限,但程序语言的实现往往都是实数范围,引入了不小的复杂性,在编写代码时如果有用到余数的特性,一定要留心,一定要测试实际的实现方式。
有关余数的定义,一般就局限于正整数范围。实际上,这个问题是属于实数域的,这点,可查看版维基百科的余数或 Remainder 词条。综合维基百科的说法,这里给一个实数域的一般定义:
假定 a ∈ R, d ∈ R, d ≠ 0, 那么余数 r 满足这样的关系:
a = qd + r, q ∈ Z,且 0 ≤ |r| < |d|
以上,按传统方式,a 可称为被除数,d 可称为除数,q 可称为商。
按照以上定义,余数可以有一正一负两个,比如:
除法式子 (-42) / (-5) 的可以表达为
-42 = 9×(-5) + 3 或 -42 = 8×(-5) + (-2)
即余数可能是3或-2。余数的这种不明确的特性,可能造成程序处理时的困惑,事实上,不同软件的处理确有不一样,参Puzzle 01: Oddity所附的表即可知。
在 C 和 Java 中,求余运算符号都是 %.
这点详情参 JLS 的说明:
附