计算评分会给出" NaN"

时间:2016-10-31 06:45:02

标签: swift firebase firebase-realtime-database

我尝试使用Firebase中的值来计算评分。但是,无论NaNratersCount值是什么,输出始终为rating(“非数字”)。是什么导致这种情况以及如何解决?

这是我从Firebase获取值的方式:

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

如果我尝试打印出rating,ratersCount和计算,则输出为:

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

但我知道这些数值甚至不为零:

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

1 个答案:

答案 0 :(得分:2)

浮点算术(小数)除以零(这是一个无效的操作)会返回一个特殊的错误值NaN非数字)。

修复非常简单,你必须首先检查零:

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

请注意,如果您有两个整数(例如Int类型),则除法会导致崩溃。

更安全的代码是合并支票并检查nil

let ratingToShow: Double

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

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

如果您担心这一点,可以防止无效数据崩溃。