取CGFloat的绝对值

adi*_*dit 34 iphone objective-c ipad ios

我怎样才能做到这一点?我尝试了abs(),但它只适用于int.有内置的方法吗?

CGFloat flo = -123;
abs(flo)
Run Code Online (Sandbox Code Playgroud)

这返回0

blu*_*yd8 70

使用fabs()

CGFloat f = -123.4f;
CGFloat g = fabs(f);
Run Code Online (Sandbox Code Playgroud)

CGFloat被定义为double在64位机器上,并float在32位机器上.如果您的目标是64位和32位,那么这个答案会变得更复杂,但仍然是正确的.

您想要使用,fabs()因为它适用于double大于的数据类型float.在32位上,如果你取a 或a的绝对值,则将(fabs()a是a double)的返回值分配给a CGFloat(a是a float)是正常的.如果您尝试存储大数字的绝对值,则可能会溢出32位.总之,64位是好的,对32位不混合和匹配,并和你会被罚款.CGFloatfloatCGFloatdoubledoubleCGFloat

ABS()宏显然可以对一些编译器的副作用.


gog*_*qaz 9

适用于64/32位系统

#if CGFLOAT_IS_DOUBLE
    CGFloat g = fabs(flo);
#else
    CGFloat g = fabsf(flo);
#endif
Run Code Online (Sandbox Code Playgroud)


Ske*_*ela 8

我通常只使用ABS宏,据我所知,无论你使用哪个系统或使用哪个原语,它都能正常工作.

CGFloat x = -1.1;
double y = -2.1;
NSInteger z = -5;

x = ABS(x);
y = ABS(y);
z = ABS(z);
Run Code Online (Sandbox Code Playgroud)


小智 5

小补充:

CGFloat g = fabs(f);
Run Code Online (Sandbox Code Playgroud)

这将导致转换警告,因为fabs()返回一个double值.要获得浮点值,您需要使用fabsf().

CGFloat g = fabsf(f);
Run Code Online (Sandbox Code Playgroud)