37

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

CGFloat flo = -123;
abs(flo)

这返回 0

4

5 回答 5

75

使用 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 ) 的返回值分配给doublea CGFloat(which is a ) 。如果您尝试存储大数的绝对值,则可能会溢出 32 位。简而言之,64 位很好,在 32 位上不要混用,你会没事的。floatCGFloatfloatCGFloatdoubledoubleCGFloat

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

于 2013-01-16T01:12:16.557 回答
9

对于 64/32 位系统

#if CGFLOAT_IS_DOUBLE
    CGFloat g = fabs(flo);
#else
    CGFloat g = fabsf(flo);
#endif
于 2014-12-09T03:55:47.707 回答
8

我通常只使用 ABS 宏,据我所知,无论您使用哪个系统或使用哪个原语,它都可以工作。

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

x = ABS(x);
y = ABS(y);
z = ABS(z);
于 2015-04-10T04:50:14.313 回答
6

小补充:

CGFloat g = fabs(f);

这将导致强制转换警告,因为 fabs() 返回一个双精度值。要返回浮点值,您需要使用 fabsf()。

CGFloat g = fabsf(f);
于 2014-01-09T11:36:58.820 回答
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
于 2020-08-18T18:55:46.307 回答