Ios 舍入一个无穷大的数?
这个问题与前面的一个问题有关,但我收到的是一个与除以0的问题无关的无穷数。例如,下面的代码在控制台中打印Ios 舍入一个无穷大的数?,ios,swift,foundation,infinite,Ios,Swift,Foundation,Infinite,这个问题与前面的一个问题有关,但我收到的是一个与除以0的问题无关的无穷数。例如,下面的代码在控制台中打印4.5300000000000002,但被标记为.isInfinite,因此我无法使用Codable进行存储。如何从这个示例中导出4.53(作为双精度) //Calculation func calculateMaximumAndAverageSkatingEfficiency() { let heartRateUnit:HKUnit = HKUni
4.5300000000000002
,但被标记为.isInfinite
,因此我无法使用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")
}
}
Double
无法精确存储4.53,原因与您无法精确记下十进制的1/3值相同。(看看您是否对此不清楚。)
如果希望舍入为十进制而不是二进制,则需要使用十进制类型。看
您的舍入(to:)
方法不正确,因为它假定“位”是十进制数字。但是,Double
使用二进制数字。我相信你想要的是:
extension Double {
func round(toDecimalPlaces places: Int) -> Decimal {
var decimalValue = Decimal(self)
var result = decimalValue
NSDecimalRound(&result, &decimalValue, places, .plain)
return result
}
}
请注意,4.53绝不是“无限的”,它略小于5。我在你的代码中没有看到它应该生成无限值。我会仔细检查你是怎么决定的 这个数字
4.5300000000000002
根本不是无限的。当您打印双倍<代码>时,您是否得到了号码?您是否使用编号检查了它是否是无限的。isInfinite是这是在控制台中打印的编号,然后通过标记。isInfinite
A会很有帮助。您发布的代码没有提到isInfinite
。请发布实际演示问题的代码。您在另一个问题中引用的错误消息说问题出在maximumCapableSpeed
,但您的代码也没有提到该属性。您是否知道,在您发布的代码中,如果AverageEfficiencyFactorRunWrapped
是无限的,您会尝试将其舍入,但是,如果averageEfficiencyFactorUnwrapped
不是无限的,您错误地打印出它是无限的?我仍然需要以一个Double结尾,但是让someDouble=Double(someDecimal作为NSNumber)
是最好的方法吗?不可能精确地将4.53存储在一个Double中。如果你转换回Double,你会得到二进制(而不是十进制)舍入到接近(但不完全)4.53的值。