2016-10-31 10 views
0

Firebaseの値で評価を計算しようとしました。しかし、出力は、ratersCountratingの値が何であっても、常にNaN(「数字ではない」)です。何が原因でこれを解決することができますか?評価が「NaN」になる

これは私がFirebaseから値を取得する方法である:私は、ratersCountと計算を格付けをプリントアウトしようとした場合、出力された

let ref = FIRDatabase.database().reference().child("Snuses").queryOrdered(byChild: "Brand").queryEqual(toValue: brandName) 
     ref.observeSingleEvent(of: .value, with: { (snapshot) in 
      if snapshot.exists(){ 

       let enumerator = snapshot.children 

       while let thisProduct = enumerator.nextObject() as? FIRDataSnapshot 
       { 

        // Chances are you'd have to create a dictionary 
        let thisProductDict = thisProduct.value as! [String:AnyObject] 
        let rating = thisProductDict["rating"] as! Double 
        let ratersCount = thisProductDict["ratersCount"] as! Double 

        let ratingToShow: Double = rating/ratersCount//Here I do the calculation 

0.0//rating 
0.0//ratersCount 
Rating is equal to nan 

しかし、私は値が知っています

Snuses 
Catch Dry Eucalyptus White Mini 
ratersCount: 2 
rating: 5 
+1

ゼロを印刷していて値がゼロでないことがわかっている場合は、問題はここにありません。たぶんあなたが悪いオブジェクトを参照しているか、データベースに問題があります。私たちはあなたのデータを見ることなく知ることができません。 – Sulthan

答えて

2

0で割る浮動小数点演算子(小数点)は、inval id操作)は、特別なエラー値NaNではない)を返します。

修正は、あなたがゼロに最初に確認する必要があり、非常に簡単です:あなたがそこに二つの整数(例えばIntタイプ)を持っていた場合、除算はクラッシュにつながることを

// return zero if ratesCount is zero 
let ratingToShow = (ratersCount == 0) ? 0 : rating/ratersCount 

注意を。あなたはそれを心配している場合は、無効なデータとのクラッシュを防ぐために

let ratingToShow: Double 

if let rating = thisProductDict["rating"] as? Double, 
    let ratersCount = thisProductDict["ratersCount"] as? Double, 
    ratersCount > 0 { 

    ratingToShow = rating/ratersCount 
} else { 
    ratingToShow = 0 
} 

安全なコードがnilのチェックで、チェックをマージすることです。

+0

恐ろしい、その説明のために非常にありがとう。これは私が思いついたはるかに良い解決策です:)そして、それは時々それがゼロであると言う、それは問題はどこか他のです。 –

関連する問題