1

float私はiPhoneアプリケーションで使用するためにsとdoublesを保存することをいじっていNSUserDefaultsましたが、精度がどのように機能するか、そしてそれがどのように機能するかについていくつかの矛盾に遭遇しました。

これは私が考えたとおりに機能します。

{
    NSString *key = @"OneLastKey";
    [PPrefs setFloat:235.1f forKey:key];
    GHAssertFalse([PPrefs getFloatForKey:key] == 235.1, @"");
    [PPrefs removeObjectForKey:key];
}

ただし、これはそうではありません。

{
    NSString *key = @"SomeDoubleKey";
    [PPrefs setDouble:234.32 forKey:key];
    GHAssertEquals([PPrefs getDoubleForKey:key], 234.32, @"");
    [PPrefs removeObjectForKey:key];
}

これはGHUnitが私に与える出力です:

'234.320007324' should be equal to '234.32'. 

しかし、最初にダブルをにキャストしてから、にキャストするfloatと、double必ず機能します。

{
    NSString *key = @"SomeDoubleKey";
    [PPrefs setDouble:234.32 forKey:key];
    GHAssertEquals([PPrefs getDoubleForKey:key], (double)(float)234.32, @"");
    [PPrefs removeObjectForKey:key];
}

私は、末尾に「f」を付けずに入力された数字はすでにdoublesと見なされていると想定していました。これは間違っていますか?もしそうなら、なぜにキャストしてからfloat正しくdouble機能するのですか?

4

1 に答える 1

4

解決しました!私のフレームワーク メソッド+(void)setDouble:(double)value forKey:(NSString*)key は実際には として定義されていたことがわかりました。渡さた値は double でしたが、メソッドで使用するために float に変換されました。単純なコピペ問題。残念ながら、Objective-C コンパイラは、他のすべての場合と同様に、少なくとも警告を表示しませんでした...+(void)setDouble:(float)value forKey:(NSString*)key

于 2011-03-23T17:32:14.350 に答える