ソリューションを、そして全てが同じバグを持っているのPrashant :固定精度型(さまざまにはdouble
,long long
など)にNSNumber
をキャスティングします。値が非常に大きい場合は破損しますNSDecimalNumber
。たとえば、受け入れられた応答はNSDecimalNumber(string: "1000000000000000.1")
で失敗します。
(スウィフトで拡張、など)より安全な実装:
extension NSNumber {
var isInteger: Bool {
var rounded = decimalValue
NSDecimalRound(&rounded, &rounded, 0, NSRoundingMode.RoundDown)
return NSDecimalNumber(decimal: rounded) == self
}
var isFraction: Bool { return !isInteger }
}
またはグローバル関数としてのObjective-C、中:多くの整数のために動作します
BOOL NumberIsFraction(NSNumber *number) {
NSDecimal rounded = number.decimalValue;
NSDecimalRound(&rounded, &rounded, 0, NSRoundDown);
return ![number isEqualToNumber:
[[NSDecimalNumber alloc] initWithDecimal:rounded]];
}
私はそれらが '!='であるべきだと思いますか? 'NumberIsFraction(@(0.0f))'は 'YES'を返すでしょうか? – hypercrypt
ああ、はい、brainfart。 :) –