我该怎么做?我尝试了abs(),但它只适用于int。有内置的方法吗?
CGFloat flo = -123;
abs(flo)
这会返回0
答案 0 :(得分:70)
使用fabs()
CGFloat f = -123.4f;
CGFloat g = fabs(f);
CGFloat
在64位计算机上定义为double
,在32位计算机上定义为float
。如果您的目标是64位和32位,那么这个答案会变得更复杂,但仍然是正确的。
您希望使用fabs()
,因为它适用于大于double
的{{1}}数据类型。在32位上,将float
(fabs()
)的返回值分配到double
(CGFloat
)是正常的,如果您正在使用float
或CGFloat
的绝对值。如果您尝试存储大float
个数字的绝对值,则可能会溢出32位CGFloat
。简而言之,64位是好的,32位不会混合和匹配double
和double
,你会没事的。
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