iOS中的取模运算符

18

我一直在寻找在iOS中类似于C语言中的%的模操作符,但是没有找到。尝试了这个链接中的答案,但是还是出现了相同的错误。 我有一个浮点变量'rotationAngle',它的角度会根据用户手指的移动而不断增加或减少。 类似于这样:

if (startPoint.x < pt.x) {
    if (pt.y<936/2) 
        rotationAngle += pt.x - startPoint.x;
    else
        rotationAngle += startPoint.x - pt.x;   
    }
    rotationAngle = (rotationAngle % 360);
}

我只需要确保旋转角度不超过+/- 360度的限制。 有任何帮助,谢谢。


3
嗯,Objective-C 是由C语言扩展而来的。因此,C语言中的 % 操作符在Objective-C中也可以使用。然而浮点数无法使用 %,所以需要先将其转换成整型。 - Tom van der Woerdt
3个回答

43

你可以使用 math.h 中的 fmod(适用于 double)和 fmodf(适用于 float):

#import <math.h>

rotationAngle = fmodf(rotationAngle, 360.0f);

1
谢谢,但它不需要导入math.h就可以工作。非常简短和精确。 - nuteron

12

使用fmod函数,它执行浮点数取模运算,定义请参见此处:http://www.cplusplus.com/reference/clibrary/cmath/fmod/。以下是其工作示例(带有返回值):

fmodf(100, 360); // 100
fmodf(300, 360); // 300
fmodf(500, 360); // 140
fmodf(1600, 360); // 160
fmodf(-100, 360); // -100
fmodf(-300, 360); // -300
fmodf(-500, 360); // -140

fmodf接受“float”作为参数,fmod接受“double”,fmodl接受“double long”,但它们都执行相同的操作。


感谢你的回答,这个方法是有效的。Objective C 很多样化,一旦你调用了像 [self methodName:parameters] 这样的方法,在下一行你可以像 methodName(parameters) 这样调用一个方法。 - nuteron

1

我先将它转换为整数

rotationAngle = (((int)rotationAngle) % 360);

如果您想要更高的准确性,请使用

float t = rotationAngle-((int)rotationAngle);
rotationAngle = (((int)rotationAngle) % 360);
rotationAngle+=t;

我觉得除非你要用它来输入飞船的行进方向,否则不需要过于担心。如果有任何损失,我认为不会有任何舍入、转换或除法操作,所以不会发生这种情况。 - Jason McTaggart

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