负数的Objective-C模运算行为很奇怪

43

我认为负数在进行取模运算时应该转换成正数……但是我无法在Objective-C中实现这一点。

我期望得到以下结果:

-1 % 3 = 2
 0 % 3 = 0
 1 % 3 = 1
 2 % 3 = 2

但是注意这一点

-1 % 3 = -1
 0 % 3 = 0
 1 % 3 = 1
 2 % 3 = 2

为什么会这样,有没有解决方法?


Clojure是我遇到的第一种正确实现mod的语言。耶! - Todd Owen
2
@ToddOwen:Python 也可以正确地完成它 - Claudiu
@Todd,Lisp两者都有。 - Pacerier
使用frem(a, b) - 你所期望的模除(在标准数学中使用的那种)在编程中称为“余数”。C语言有fmod()和frem()函数,而你正在使用mod(也称为“%”),你需要使用rem。在数学中的模除等同于代码中的余数(rem)。有点傻,我知道。 - Albert Renshaw
我注意到frem(a,b)仅在GNU C中存在,而未被引入Obj-C。相当于这个是:a-b*floor((float)a/(float)b) - Albert Renshaw
12个回答

0

使用:a-b*floor((float)a/(float)b)

代替:a%b

你期望得到余数,但你使用的是模运算。在数学上它们是一样的,但在C语言中它们是不同的。 GNU-C有Rem()和Mod(),而objective-c只有mod(),所以您必须使用上面的代码来模拟rem函数(在数学世界中与mod相同,但在编程世界中不同[至少对于大多数语言])


另外请注意,您可以定义一个易于使用的宏来完成此操作。

#define rem(a,b) ((int)(a-b*floor((float)a/(float)b)))

然后您只需在代码中使用rem(-1,3)即可正常工作。


0

对于余数,有两种选择,符号取决于语言。 ANSI C 选择被除数的符号。我猜这就是为什么你会看到 Objective-C 也这样做的原因。另请参阅维基百科条目


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接