我怎样才能做到这一点?我尝试了 abs() 但它只适用于 int。有内置的方法吗?
CGFloat flo = -123;
abs(flo)
这返回 0
我怎样才能做到这一点?我尝试了 abs() 但它只适用于 int。有内置的方法吗?
CGFloat flo = -123;
abs(flo)
这返回 0
使用 fabs()
CGFloat f = -123.4f;
CGFloat g = fabs(f);
CGFloat
被定义为double
在 64 位机器上和float
在 32 位机器上。如果您同时针对 64 位和 32 位,则此答案会变得更加复杂,但仍然正确。
您想使用fabs()
它是因为它适用于double
大于float
. 在 32 位上,仅当您采用 a或的绝对值时,才可以将fabs()
(which is a ) 的返回值分配给double
a CGFloat
(which is a ) 。如果您尝试存储大数的绝对值,则可能会溢出 32 位。简而言之,64 位很好,在 32 位上不要混用,你会没事的。float
CGFloat
float
CGFloat
double
double
CGFloat
该ABS()
宏显然会对某些编译器产生副作用。
对于 64/32 位系统
#if CGFLOAT_IS_DOUBLE
CGFloat g = fabs(flo);
#else
CGFloat g = fabsf(flo);
#endif
我通常只使用 ABS 宏,据我所知,无论您使用哪个系统或使用哪个原语,它都可以工作。
CGFloat x = -1.1;
double y = -2.1;
NSInteger z = -5;
x = ABS(x);
y = ABS(y);
z = ABS(z);
小补充:
CGFloat g = fabs(f);
这将导致强制转换警告,因为 fabs() 返回一个双精度值。要返回浮点值,您需要使用 fabsf()。
CGFloat g = fabsf(f);
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