Float値に対するfetch条件の生成について教えてください
Float値に対するfetch条件の生成について教えてください。
Ingteger値に対しての条件設定は期待した結果が得られたのですが、Float値に対しての条件設定では期待した結果が得られませんでした。
Float値を検索する場合は別の方法があるのでしょうか?
もしくはFloat値のデータモデルに問題があるのでしょうか?
今更なのですが、やりたかったことに関して追記します。
SwiftのFloat型の精度の範囲の値をCoreDataを用いて永続化したデータを検索し、検索結果を得たい。
とてもシンプルな機能を想定していて、次のような内容は含みません。
- プログラム内で数値計算等を行い、そこで得た値を永続化する。
- プログラム内で数値計算等を行い、そこで得た値をkeyとする。
- Float型の精度の範囲の値外の値をFloat型の値として、永続化および検索keyとする。
永続化および検索keyとして使用する値は、Float型の精度の範囲の値だけが対象です。
コードに不具合などありましたら教えてください。
(試した結果)
条件 |fetchされた値|コメント
===============+=============+=====================================
fvalue < 0.05 |0.05以下 |**0.05未満の値ではない。0.05もfetchされる。なぜ?**
fvalue <= 0.05 |0.05以下 |期待通り問題なし。
fvalue == 0.05 | |**何もれられなかった。0.05が得られないのはなぜ?**
fvalue > 0.05 |0.06以上 |期待通り問題なし。
fvalue >= 0.05 |0.06以上 |**0.05以上の値ではない。0.05は得られない。なぜ?**
---------------+-------------+-------------------------------------
ivalue < 5 |5未満 |期待通り問題なし。
ivalue <= 5 |5以下 |期待通り問題なし。
ivalue == 5 |5 |期待通り問題なし。
ivalue > 5 |6以上 |期待通り問題なし。
ivalue >= 5 |5以上 |期待通り問題なし。
(Core model)
Entities:
Entity|Attribute|Type
======+=========+======
Pin |name |String
|fvalue |Float
|ivalue |Integer16
(code)
[AppDelegate.swift]
func applicationDidFinishLaunching(_ aNotification: Notification) {
for i in 0..<10 {
autoreleasepool { (result) in
let pin = NSEntityDescription.insertNewObject(forEntityName: "Pin", into: managedObjectContext) as! Pin
pin.name = "pin\(i)"
pin.fvalue = NSNumber(value: Float(i) * 0.01)
pin.ivalue = NSNumber(value: i)
do {
try managedObjectContext.save()
} catch {
let nserror = error as NSError
NSApplication.shared().presentError(nserror)
}
}
managedObjectContext.refreshAllObjects()
}
do {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Pin")
fetchRequest.predicate = NSPredicate(format: "fvalue < 0.05")
//fetchRequest.predicate = NSPredicate(format: "ivalue < 5")
let sortDiscriptor = NSSortDescriptor(key: "name", ascending: true)
fetchRequest.sortDescriptors = [sortDiscriptor]
let pins = try managedObjectContext.fetch(fetchRequest) as! [Pin]
for pin in pins {
print("name: \(pin.name!), fvalue: \(pin.fvalue!), ivalue: \(pin.ivalue!)")
}
} catch let error as NSError {
fatalError("\(error)")
}
}