Ios 舍入一个无穷大的数?

Ios 舍入一个无穷大的数?,ios,swift,foundation,infinite,Ios,Swift,Foundation,Infinite,这个问题与前面的一个问题有关,但我收到的是一个与除以0的问题无关的无穷数。例如,下面的代码在控制台中打印4.5300000000000002,但被标记为.isInfinite,因此我无法使用Codable进行存储。如何从这个示例中导出4.53(作为双精度) //Calculation func calculateMaximumAndAverageSkatingEfficiency() { let heartRateUnit:HKUnit = HKUni

这个问题与前面的一个问题有关,但我收到的是一个与除以0的问题无关的无穷数。例如,下面的代码在控制台中打印
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的值。