【发布时间】:2018-08-03 23:47:29
【问题描述】:
这个问题与较早的question 有关,但是我收到一个与除以 0 问题无关的无限数。例如,下面的代码在控制台中打印4.5300000000000002,但被标记为.isInfinate,因此我无法使用Codable 进行存储。我怎样才能从这个例子中得出 4.53(作为双精度数)?
//Calculation
func calculateMaximumAndAverageSkatingEfficiency() {
let heartRateUnit:HKUnit = HKUnit(from: "count/min")
let heartRatesAsDouble = heartRateValues.map { $0.quantity.doubleValue(for: heartRateUnit)}
let maxHeartRate = heartRatesAsDouble.max()
guard let maxHeartRateUnwrapped = maxHeartRate else { return }
maximumEfficiencyFactor = ((1760.0 * (maxSpeed / 60)) / maxHeartRateUnwrapped).round(to: 2)
guard let averageIceTimeHeartRateUnwrapped = averageIceTimeHeartRate else { return }
averageEfficiencyFactor = ((1760.0 * (averageSpeed / 60)) / averageIceTimeHeartRateUnwrapped).round(to: 2)
}
//Round extension I am using
extension Double {
func round(to places: Int) -> Double {
let divisor = pow(10.0, Double(places))
return Darwin.round(self * divisor) / divisor
}
}
//Usage
if let averageEfficiencyFactorUnwrapped = averageEfficiencyFactor {
if averageEfficiencyFactorUnwrapped.isFinite {
hockeyTrackerMetadata.averageEfficiencyFactor = averageEfficiencyFactorUnwrapped.round(to: 2)
} else {
print("AEF is infinite")
}
}
【问题讨论】:
-
4.5300000000000002这个数字根本不是无限的。您在打印Double时得到号码了吗?你用theNumber.isInfinite检查它是无限的吗? -
是的,这是在控制台中打印的数字,然后通过
.isInfinite进行标记 -
minimal reproducible example 会很有帮助。
-
您发布的代码未提及
isInfinite。请发布实际演示问题的代码。您在其他问题中引用的错误消息表明问题出在maximumCapableSpeed,但您的代码也没有提及该属性。 -
您是否知道,在您发布的代码中,如果
averageEfficiencyFactorUnwrapped是无限的,您会尝试对其进行四舍五入,但如果averageEfficiencyFactorUnwrapped不是无限,您就错了打印它是无限的吗?
标签: ios swift foundation infinite