Округление двойного значения до x количества знаков после запятой в быстром

Может кто-нибудь сказать мне, как округлить двойное значение до х числа десятичных знаков в Swift?

Я имею:

var totalWorkTimeInHours = (totalWorkTime/60/60)

С totalWorkTime будучи NSTimeInterval (двойной) в секунду.

totalWorkTimeInHours даст мне часы, но это даст мне количество времени в таком длинном точном числе, например 1.543240952039......

Как мне округлить это, скажем, до 1.543, когда я печатаю totalWorkTimeInHours?

37 ответов

если вы хотите, чтобы после запятой оставалось только 0 для раунда, посмотрите на этот пример ниже:

      extension Double {
    func isInteger() -> Any {
        let check = floor(self) == self
        if check {
            return Int(self)
        } else {
            return self
        }
    }
}

let toInt: Double = 10.0
let stillDouble: Double = 9.12

print(toInt.isInteger) // 10
print(stillDouble.isInteger) // 9.12
extension String{
  var roundedValue:String {
     return String(format: "%.3f", self)
}}

Использование:

totalWorkTimeInHours.roundedValue
//find the distance between two points
let coordinateSource = CLLocation(latitude: 30.7717625, longitude:76.5741449 )
let coordinateDestination = CLLocation(latitude: 29.9810859, longitude: 76.5663599)
let distanceInMeters = coordinateSource.distance(from: coordinateDestination)
let valueInKms = distanceInMeters/1000
let preciseValueUptoThreeDigit = Double(round(1000*valueInKms)/1000)
self.lblTotalDistance.text = "Distance is : \(preciseValueUptoThreeDigit) kms"

Во многих примерах используется математика, проблема в том, что числа с плавающей запятой являются аппроксимацией действительного числа, нет способа точно выразить 0,1 (1/10) как число с плавающей запятой, так же как нет точного способа точно выразить ⅓ с помощью десятичных точек, поэтому вы нужно спросить себя, чего именно вы пытаетесь достичь, если вы просто хотите отобразить их, оставьте их такими, какие они есть в коде, попытка их округления оправдает получение менее точного результата, поскольку вы выбрасываете драгоценный, круглый ⅓ в десятичной записи до 1 десятичного знака не даст вам число ближе к ⅓, используйте NumberFormate, чтобы округлить его, если у вас есть что-то вроде класса viewModel, его можно использовать для возврата строкового представления к номерам ваших моделей. NumberFormaters дает вам большой контроль над форматированием чисел и количеством десятичных разрядов, которые вы хотите.

Для многих приложений вам нужно округлить точное количество знаков после запятой.

Для некоторых других у вас нет такого ограничения и вы хотите «сжать» размер вывода, но все же хотите избежать преобразования чисел в строки (и наоборот позже), как при экспорте JSON с миллионами чисел.

В этом случае вы можете использовать «трюк» для округления мантиссы (мантиссы), а не целого числа. В таком случае вы получите окончательные десятичные знаки, и большинство чисел все еще будут иметь максимум, например, 3 десятичных знака (если необходимо), в то время как у некоторых будет немного больше.

Это то, что вы можете ожидать от этого подхода, все еще работая с десятичными числами:

5.2472

5.2516

5.2556

5.26

5.264

вместо:

5.24731462499949

5.251488374999099

5.25566283399894

5.259839374999501

5.264012208999702

      let value = 5.24731462499949

print(value)
// 5.24731462499949

let valueSignificandRounded = round((1000 * 10) * value.significand) / (1000 * 10)

let valueRounded = CGFloat(sign: v.sign, exponent: v.exponent, significand: valueSignificandRounded)

print(valueRounded)
// 5.2472

Swift 4 Лучший способ

Это то, что помогло мне округлить до 2 знаков после запятой

      let val = round(100 * scale) / 100

Округление двойного значения до x десятичных знаков в Swift

вход = 2,99999999 выход = 2,9

вход = 2.0 выход = 2

print(2.9999.roundDecimal(places: 1)) // Будет напечатано "2,9"

print(2.9999.roundDecimal(places: 2)) // Будет напечатано "2,99"

      extension Double {
    func roundDecimal(places: Int = 2) -> String {
        if self == Double(Int(self)) {
            return "\(Int(self))"
        } else {
            let multiplier = pow(10.0, Double(places))
            let doubleNumber = self
            let integerPart = Int(doubleNumber)
            let decimalPart = Int(doubleNumber * multiplier) % Int(multiplier)
            let combinedString = "\(integerPart).\(decimalPart)"
            return combinedString
        }
    }
}
Другие вопросы по тегам