我尝试使用Firebase中的值来计算评分。但是,无论NaN
和ratersCount
值是什么,输出始终为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
答案 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
}
如果您担心这一点,可以防止无效数据崩溃。