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?

1voto

Jeri P.M Punkte 399

Wenn Sie nach dem Komma nur 0 für die Runde haben möchten, versuchen Sie dies:

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

1voto

Davender Verma Punkte 469
//finde die Entfernung zwischen zwei Punkten
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 = "Entfernung beträgt: \(preciseValueUptoThreeDigit) km"

1voto

Nathan Day Punkte 5797

Viele Beispiele verwenden Mathematik, das Problem ist, dass Fließkommazahlen Approximationen von echten Zahlen sind, es gibt keine Möglichkeit, 0.1 (1/10) genau als Fließkommazahl auszudrücken, genauso wie es keine genaue Möglichkeit gibt, genau mit Dezimalpunkten auszudrücken, also musst du dich genau fragen, was du erreichen willst, wenn du sie nur anzeigen möchtest, lass sie so, wie sie im Code sind, versuche sie aufzurunden, wird dir ein weniger genaues Ergebnis geben, da du wertvolle Informationen wegwirfst, Runden in Dezimalschreibweise auf eine Dezimalstelle wird dir keine Zahl näher bringen, verwende NumberFormate zum Runden, wenn du so etwas wie eine ViewModel-Klasse hast, kann sie verwendet werden, um eine Zeichenfolgendarstellung deiner Modellzahlen zurückzugeben. NumberFormatter geben dir viel Kontrolle darüber, wie Zahlen formatiert werden und wie viele Dezimalstellen du haben möchtest.

1voto

vedrano Punkte 2911

Für viele Anwendungen benötigen Sie eine genaue Anzahl von Dezimalstellen zum Runden.

Für einige andere haben Sie keine solche Einschränkung und möchten die Ausgabegröße "komprimieren", möchten jedoch dennoch vermeiden, die Zahl in Zeichenfolgen umzuwandeln (und später wieder zurück), z. B. beim Exportieren von JSON mit Millionen von Zahlen.

In diesem Fall können Sie einen 'Trick' anwenden, um den Vorkommabereich (Mantisse) und nicht die ganze Zahl zu runden. In einem solchen Fall werden Sie mit den endgültigen Dezimalstellen enden, und die meisten Zahlen werden weiterhin höchstens z. B. 3 Dezimalstellen (wenn nötig) beibehalten, während einige leicht mehr haben werden.

Das ist das, was Sie mit diesem Ansatz erwarten können, während Sie immer noch mit Dezimalzahlen arbeiten:

5.2472

5.2516

5.2556

5.26

5.264

anstatt von:

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

1voto

Kingsley Mitchell Punkte 2240

Der beste Weg für Swift 4

Das ist was für mich funktioniert hat, um auf 2 Dezimalstellen zu runden

let val = round(100 * scale) / 100

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