取CGFloat的绝对值

时间:2013-01-16 01:08:44

标签: iphone ios objective-c ipad

我该怎么做?我尝试了abs(),但它只适用于int。有内置的方法吗?

CGFloat flo = -123;
abs(flo)

这会返回0

5 个答案:

答案 0 :(得分:70)

使用fabs()

CGFloat f = -123.4f;
CGFloat g = fabs(f);

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

您希望使用fabs(),因为它适用于大于double的{​​{1}}数据类型。在32位上,将floatfabs())的返回值分配到doubleCGFloat)是正常的,如果您正在使用floatCGFloat的绝对值。如果您尝试存储大float个数字的绝对值,则可能会溢出32位CGFloat。简而言之,64位是好的,32位不会混合和匹配doubledouble,你会没事的。

CGFloat宏显然会对某些编译器产生副作用。

答案 1 :(得分:9)

对于64/32位系统

#if CGFLOAT_IS_DOUBLE
    CGFloat g = fabs(flo);
#else
    CGFloat g = fabsf(flo);
#endif

答案 2 :(得分:8)

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

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

x = ABS(x);
y = ABS(y);
z = ABS(z);

答案 3 :(得分:5)

小补充:

CGFloat g = fabs(f);

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

CGFloat g = fabsf(f);

答案 4 :(得分:0)

fabs已贬值。 abs的签名现已与此签名通用

/// Returns the absolute value of the given number.
///
/// The absolute value of `x` must be representable in the same type. In
/// particular, the absolute value of a signed, fixed-width integer type's
/// minimum cannot be represented.
///
///     let x = Int8.min
///     // x == -128
///     let y = abs(x)
///     // Overflow error
///
/// - Parameter x: A signed number.
/// - Returns: The absolute value of `x`.
@inlinable public func abs<T>(_ x: T) -> T where T : Comparable, T : SignedNumeric