2

ユーザーが数値(浮動小数点数または整数)を入力します。数値は下限より大きくなければなりません。

これは、UITextFieldから番号を取得するためのコードです。

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber *currentNumber = [f numberFromString:self.textfield.text];
[f release];

多くの場合、下限は0.1lowerBoundです(NSNumberです)。

このコードがあり、テキストフィールドに0.1と入力すると、そのisValidままになりYESます。

BOOL isValid = YES;
if ([currentNumber floatValue] < [self.lowerBound floatValue]) {
    isValid = NO;
}

しかし、私はそれを行う方が良いでしょうが:

BOOL isValid = YES;
if ([currentNumber compare:self.lowerBound] == NSOrderedAscending) {
    isValid = NO;
}

ただし、もう一度0.1を入力します(そしてlowerBoundはまだ0.1です)ifステートメントはtrueと評価されます(currentNumberがself.lowerBoundよりも小さいかのように)。

コードは0.11以上で期待どおりに機能します。私にも上限があります:

BOOL isValid = YES;
if ([currentNumber compare:self.higherBound] == NSOrderDescending) {
    isValid = NO;
}

そして、これは、higherBoundと同じ値(ほとんどの場合10)を入力した場合を含め、期待どおりに機能します。

私が理解しているようにcompare:、NSNumberのメソッドはオブジェクトのアドレスではなく値を比較しますが、なぜそれが下限で機能しないのですか?

4

1 に答える 1

2

浮動小数点数は正確ではないため、1 つの NSNumber の 0.1 は、他の NSNumber のものとは異なる場合があります。

于 2012-08-15T20:04:10.613 に答える