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?

534voto

zisoft Punkte 22998

Sie können die round-Funktion von Swift verwenden, um dies zu erreichen.

Um ein Double mit einer Präzision von 3 Dezimalstellen zu runden, multiplizieren Sie es zuerst mit 1000, runden es und teilen das gerundete Ergebnis durch 1000:

let x = 1,23556789
let y = Double(round(1000 * x) / 1000)
print(y) /// 1.236

Im Gegensatz zu jeder Art von printf(...)- oder String(format: ...)-Lösungen ist das Ergebnis dieser Operation weiterhin vom Typ Double.

Was die Kommentare betrifft, dass es manchmal nicht funktioniert, lesen Sie bitte: Was jeder Programmierer über Gleitkommaarithmetik wissen sollte

495voto

Sebastian Punkte 8732

Erweiterung für Swift 2

Eine allgemeinere Lösung ist die folgende Erweiterung, die mit Swift 2 & iOS 9 funktioniert:

extension Double {
    /// Rundet die Dezimalstellen des Doubles auf die angegebene Anzahl
    func roundToPlaces(places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return round(self * divisor) / divisor
    }
}

Erweiterung für Swift 3

In Swift 3 wird round durch rounded ersetzt:

extension Double {
    /// Rundet die Dezimalstellen des Doubles auf die angegebene Anzahl
    func rounded(toPlaces places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}

Beispiel, das Double auf 4 Dezimalstellen rundet:

let x = Double(0.123456789).roundToPlaces(4)  // x wird unter Swift 2 zu 0,1235
let x = Double(0.123456789).rounded(toPlaces: 4)  // Swift 3 Version

489voto

vacawama Punkte 148405

Wie runde ich dies, zum Beispiel, auf 1,543 ab, wenn ich totalWorkTimeInHours drucke?

Um totalWorkTimeInHours auf 3 Stellen zu runden, verwenden Sie den String Konstruktor, der einen format string akzeptiert:

print(String(format: "%.3f", totalWorkTimeInHours))

387voto

Imanou Petit Punkte 83480

Mit Swift 5 können Sie je nach Bedarf einen der 9 folgenden Stile wählen, um ein gerundetes Ergebnis von einem Double zu erhalten.


1. Verwenden der FloatingPoint rounded() Methode


Im einfachsten Fall können Sie die Double rounded() Methode verwenden.

let gerundeterWert1 = (0,6844 * 1000).rounded() / 1000
let gerundeterWert2 = (0,6849 * 1000).rounded() / 1000
print(gerundeterWert1) // gibt 0,684 zurück
print(gerundeterWert2) // gibt 0,685 zurück

2. Verwenden der FloatingPoint rounded(_:) Methode


let gerundeterWert1 = (0,6844 * 1000).rounded(.toNearestOrEven) / 1000
let gerundeterWert2 = (0,6849 * 1000).rounded(.toNearestOrEven) / 1000
print(gerundeterWert1) // gibt 0,684 zurück
print(gerundeterWert2) // gibt 0,685 zurück

3. Verwenden der Darwin round Funktion


Foundation bietet eine round Funktion über Darwin an.

import Foundation

let gerundeterWert1 = round(0,6844 * 1000) / 1000
let gerundeterWert2 = round(0,6849 * 1000) / 1000
print(gerundeterWert1) // gibt 0,684 zurück
print(gerundeterWert2) // gibt 0,685 zurück

4. Verwenden einer benutzerdefinierten Methode für die Double Erweiterung, die mit den Darwin round und pow Funktionen erstellt wurde


Wenn Sie die vorherige Operation mehrmals wiederholen möchten, kann es eine gute Idee sein, Ihren Code umzustrukturieren.

import Foundation

extension Double {
    func roundToDecimal(_ nachkommastellen: Int) -> Double {
        let multiplikator = pow(10, Double(nachkommastellen))
        return Darwin.round(self * multiplikator) / multiplikator
    }
}

let gerundeterWert1 = 0,6844.roundToDecimal(3)
let gerundeterWert2 = 0,6849.roundToDecimal(3)
print(gerundeterWert1) // gibt 0,684 zurück
print(gerundeterWert2) // gibt 0,685 zurück

5. Verwenden der NSDecimalNumber rounding(accordingToBehavior:) Methode


Wenn nötig, bietet NSDecimalNumber eine ausführliche, aber leistungsstarke Lösung für das Runden von Dezimalzahlen.

import Foundation

let scale: Int16 = 3

let verhalten = NSDecimalNumberHandler(roundingMode: .plain, scale: scale, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: true)

let gerundeterWert1 = NSDecimalNumber(value: 0,6844).rounding(accordingToBehavior: verhalten)
let gerundeterWert2 = NSDecimalNumber(value: 0,6849).rounding(accordingToBehavior: verhalten)

print(gerundeterWert1) // gibt 0,684 zurück
print(gerundeterWert2) // gibt 0,685 zurück

6. Verwenden der NSDecimalRound(_:_:_:_:) Funktion


import Foundation

let skala = 3

var wert1 = Decimal(0,6844)
var wert2 = Decimal(0,6849)

var gerundeterWert1 = Decimal()
var gerundeterWert2 = Decimal()

NSDecimalRound(&gerundeterWert1, &wert1, skala, NSDecimalNumber.RoundingMode.plain)
NSDecimalRound(&gerundeterWert2, &wert2, skala, NSDecimalNumber.RoundingMode.plain)

print(gerundeterWert1) // gibt 0,684 zurück
print(gerundeterWert2) // gibt 0,685 zurück

7. Verwenden der NSString init(format:arguments:) Initialisierung


Wenn Sie aus Ihrer Rundungoperation eine NSString zurückgeben möchten, ist die Verwendung des NSString Initialisierers eine einfache, aber effiziente Lösung.

import Foundation

let gerundeterWert1 = NSString(format: "%.3f", 0,6844)
let gerundeterWert2 = NSString(format: "%.3f", 0,6849)
print(gerundeterWert1) // gibt 0,684 zurück
print(gerundeterWert2) // gibt 0,685 zurück

8. Verwenden der String init(format:_:) Initialisierung


Der Swift String Typ ist mit der Foundation NSString Klasse verbunden. Daher können Sie den folgenden Code verwenden, um aus Ihrer Rundungoperation einen String zurückzugeben:

import Foundation

let gerundeterWert1 = String(format: "%.3f", 0,6844)
let gerundeterWert2 = String(format: "%.3f", 0,6849)
print(gerundeterWert1) // gibt 0,684 zurück
print(gerundeterWert2) // gibt 0,685 zurück

9. Verwenden des NumberFormatter


Wenn Sie erwarten, dass Ihre Rundungoperation ein String? zurückgibt, bietet NumberFormatter eine hoch anpassbare Lösung.

import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal
formatter.roundingMode = NumberFormatter.RoundingMode.halfUp
formatter.maximumFractionDigits = 3

let gerundeterWert1 = formatter.string(from: 0,6844)
let gerundeterWert2 = formatter.string(from: 0,6849)
print(String(describing: gerundeterWert1)) // gibt Optional("0,684") aus
print(String(describing: gerundeterWert2)) // gibt Optional("0,685") aus

208voto

Claudio Guirunas Punkte 3012

In Swift 5.7 and Xcode 14:

let pi: Double = 3.14159265358979
String(format:"%.2f", pi)

Beispiel:

Runden eines Double-Werts

PS.: Es ist immer noch das gleiche seit Swift 2.0 und Xcode 7.2

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