【问题标题】:NSNumber from CGFloat来自 CGFloat 的 NSNumber
【发布时间】:2013-06-12 14:09:48
【问题描述】:

有没有一种安全的方法可以将CGFloat“转换”为NSNumber

NSNumber 具有 numberWithFloat:numberWithDouble: 方法,但 CGFloat 被定义为 floatdouble,具体取决于平台,使用其中任何一种似乎都有风险。

或者numberWithDouble:CGFloat 一起使用是否安全,因为它的精度更高?

【问题讨论】:

  • 如果你有足够高的编译器版本,直接写@(myNumber),编译时就解决了。但是你可以安全地调用 [NSNumber numberWithDouble: myNumber],如果 CGFloat 被定义为 double 你正确地执行它,它 CGFloat 被定义为是浮动的,你仍然没有失去任何精度。
  • 安全吗?你能解释一下吗?
  • 安全为“没有精度损失”。这就是我被否决的原因吗?
  • 我投了反对票,因为恕我直言,您只是想多了。 C 中充满了处理双精度的函数,它们不会被覆盖以使用浮点数,因为如果您传递浮点数而不是双精度数不会发生任何有害的事情。它只会被隐式转换为 double,这会使用额外的精度。
  • 如果您正在处理金钱,您可能希望考虑使用定点或十进制表示。请参阅NSDecimalNSDecimalNumber

标签: objective-c floating-point nsnumber cgfloat


【解决方案1】:

我相信@ NSNumber 字面量就足够了

@(myCGFloat)

在此处阅读更多信息:http://clang.llvm.org/docs/ObjectiveCLiterals.html

【讨论】:

  • 感谢您的解决方案和链接。这很有启发性:)
【解决方案2】:

我是这样处理的:

@interface NSNumber (CGFloatAdditions)

+ (NSNumber*)numberWithCGFloat: (CGFloat)value;
- (CGFloat)CGFloatValue;

@end

@implementation NSNumber (CGFloatAdditions)

+ (NSNumber*)numberWithCGFloat: (CGFloat)value
{
#if CGFLOAT_IS_DOUBLE
    return [NSNumber numberWithDouble: (double)value];
#else
    return [NSNumber numberWithFloat: value];
#endif
}

- (CGFloat)CGFloatValue
{
#if CGFLOAT_IS_DOUBLE
    return [self doubleValue];
#else
    return [self floatValue];
#endif
}


@end

CGFLOAT_IS_DOUBLE 由平台有条件地在CGBase.h 中定义。

【讨论】:

  • 这甚至没有必要,它是过度编码。如果您调用 [NSNumber numberWithDouble: value] (对于不支持文字数字的编译器版本),无论数字是浮点数还是双精度数,您都不会冒失去任何精度的风险。
  • 是的,但是在 CGFloat 是浮点数的平台上,您会浪费循环在浮点数和双精度数之间进行转换。但是无所谓。用这个,不要用这个。我很久以前写过它,我继续使用它。它对我有用。
  • Thnaks @ipmcc,我将使用 Lukas 的解决方案,但你的解决方案是我最初正在寻找的。​​span>
  • 我觉得奇怪的是这已经不是 NSNumber,因为他们确实为 NSInteger 添加了方法。
猜你喜欢
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 2016-03-21
  • 2013-08-13
  • 2010-11-16
相关资源
最近更新 更多