552 Stimmen

Runden eines Double-Werts auf x Dezimalstellen in Swift

Kann mir jemand sagen, wie man einen Double-Wert auf x Dezimalstellen in Swift rundet?

Ich habe:

var totalWorkTimeInHours = (totalWorkTime/60/60)

Wobei totalWorkTime eine NSTimeInterval (Double) in Sekunden ist.

totalWorkTimeInHours gibt mir die Stunden, aber es gibt mir die Zeit in einer so langen präzisen Zahl, z.B. 1.543240952039......

Wie kann ich das auf z.B. 1.543 abrunden, wenn ich totalWorkTimeInHours drucke?

61voto

Krunal Patel Punkte 1581

Dies ist ein vollständig funktionierender Code

Swift 3.0/4.0/5.0, Xcode 9.0 GM/9.2 und höher

let doubleValue : Double = 123.32565254455
self.lblValue.text = String(format:"%.f", doubleValue)
print(self.lblValue.text)

Ausgabe - 123

let doubleValue : Double = 123.32565254455
self.lblValue_1.text = String(format:"%.1f", doubleValue)
print(self.lblValue_1.text)

Ausgabe - 123.3

let doubleValue : Double = 123.32565254455
self.lblValue_2.text = String(format:"%.2f", doubleValue)
print(self.lblValue_2.text)

Ausgabe - 123.33

let doubleValue : Double = 123.32565254455
self.lblValue_3.text = String(format:"%.3f", doubleValue)
print(self.lblValue_3.text)

Ausgabe - 123.326

35voto

Ash Punkte 8661

Aufbauend auf Yogis Antwort hier eine Swift-Funktion, die das erledigt:

func roundToPlaces(value:Double, places:Int) -> Double {
    let divisor = pow(10.0, Double(places))
    return round(value * divisor) / divisor
}

Als Erweiterung mit Rundungsregel:

extension Double {
    /// - gibt zurück: Gerundeter Wert mit spezifischer Rundungsregel und Genauigkeit
    func roundToPlaces(_ rule: FloatingPointRoundingRule? = .toNearestOrEven, precision: Int) -> Double {
        let divisor = pow(10.0, Double(precision))
        return (self * divisor).rounded(rule) / divisor
    }
}

print(0.123456.roundToPlaces(.down, precision: 4)) // 0.1234
print(0.123456.roundToPlaces(.up, precision: 4)) // 0.1235

31voto

jaiswal Rajan Punkte 4641

In Swift 3.0 und Xcode 8.0:

extension Double {
    func roundTo(places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}

Verwenden Sie diese Erweiterung wie folgt:

let doubleValue = 3.567
let roundedValue = doubleValue.roundTo(places: 2)
print(roundedValue) // druckt 3.56

26voto

Naishta Punkte 10822

Swift 4, Xcode 10

yourLabel.text =  String(format:"%.2f", yourDecimalValue)

Swift 4, Xcode 10

yourLabel.text =  String(format:"%.2f", yourDecimalValue)

21voto

Rob Punkte 389782

Es gibt zwei separate Fragen:

  1. Die genaue interne Darstellung des gerundeten Dezimalwerts

    Wenn Sie Double-Werte runden möchten, sollten Sie möglicherweise Swift Decimal verwenden, damit keine Fehler auftreten, wenn Sie mit diesen gerundeten Werten mathematisch arbeiten. Wenn Sie Decimal verwenden, kann es Dezimalwerte dieses gerundeten Gleitkomma-Werts genau darstellen.

    Also können Sie Folgendes tun:

    extension Double {
        /// Konvertiere `Double` in `Decimal`, indem es auf `scale` Dezimalstellen gerundet wird.
        ///
        /// - Parameters:
        ///   - scale: Anzahl der Dezimalstellen, auf die gerundet werden soll. Standardmäßig `0`.
        ///   - mode: Der bevorzugte Rundungsmodus. Standardmäßig `.plain`.
        /// - Returns: Der gerundete `Decimal`-Wert.
    
        func roundedDecimal(to scale: Int = 0, mode: NSDecimalNumber.RoundingMode = .plain) -> Decimal {
            var decimalValue = Decimal(self)
            var result = Decimal()
            NSDecimalRound(&result, &decimalValue, scale, mode)
            return result
        }
    }

    Dann können Sie den gerundeten Decimal-Wert wie folgt erhalten:

    let foo = 1427.3000000002
    let value = foo.roundedDecimal(to: 2)          // ergibt 1427,30

    Dieses Konzept, Decimal für den Wert zu verwenden, ist in Finanz-Apps unerlässlich, in denen Sie Fehler, die bei Berechnungen von binären Gleitkommazahlen eingeführt wurden, nicht einfach ignorieren/ausblenden möchten.

  2. Die Zeichenfolgendarstellung eines gerundeten Werts in der UI

    Wenn Sie ihn mit einer bestimmten Anzahl von Dezimalstellen anzeigen möchten (und die Zeichenfolge für die aktuelle lokalisierung des Benutzers anpassen möchten), können Sie einen NumberFormatter verwenden:

    let formatter = NumberFormatter()
    formatter.maximumFractionDigits = 2
    formatter.minimumFractionDigits = 2
    formatter.numberStyle = .decimal
    
    if let string = formatter.string(for: value) {
        print(string)                              // ergibt korrekt “1.427,30” in Deutschland; “1,427.30” in den USA
    }

    Beachten Sie, dass die Verwendung eines Formatters (insbesondere die Lokalisierung) sowohl mit Decimal-Werten als auch mit binären Gleitkommazahlen nützlich ist.

    Beachten Sie auch, dass das oben genannte auf AppKit/UIKit zutrifft. In SwiftUI können Sie den “specifier” verwenden, und er wird die Zeichenfolge für Sie lokalisieren und formatieren:

    Text("Wert ist \(value, specifier: "%0.2f")") // ergibt erneut “1.427,30” in Deutschland; “1,427.30” in den USA

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X