1

1 つのプロパティが 36.6 または 19.9 のような float 値であるオブジェクトのセットがあります。34.6 などの値が与えられた場合、このプロパティの NSNumber float 値が 34.6 に丸められるオブジェクトのみをフェッチする述語をどのように設計すればよいでしょうか?

通常、次のようなテストを行います。

if(value - test <= .01 && test - value <= .01) { //they match }

しかし、述語内でこれを行うにはどうすればよいでしょうか。述語には、それ自体の内部で基本的な算術演算を実行したり、2 つの float 値の等価性をテストしたりする機能がないようです。2 つの float 値が同じかどうかを確認するのは悪くありませんか? それとも、述語検索は、2 つの float を比較していることを認識しており、妥当な精度でのみ実行しているのでしょうか?

4

1 に答える 1

3

これはうまくいくはずです:

float test = 34.6;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"value >= %f AND value <= %f",
    test - 0.01, test + 0.01];

更新:実際には、Core Data 述語でいくつかの演算を行うことができます。次の述語も同様に機能します。

[NSPredicate predicateWithFormat:@"abs(value - %f) < 0.01", test];

http://www.sqlite.org/datatype3.htmlによると、すべての実数は 8 バイトの IEEE 浮動小数点数として SQLite データベースに格納されます。したがって、36.6 や 19.9 などの数値を正確に格納することはできず、ある程度の許容範囲 (おそらく 0.01 未満) と比較することが正しい方法です。

于 2013-10-31T18:04:52.847 に答える