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?

20voto

Merichle Punkte 665

Der Code für bestimmte Dezimalstellen nach dem Komma lautet:

var a = 1.543240952039
var roundedString = String(format: "%.3f", a)

Hier gibt %.3f dem Swift die Anweisung, diese Zahl auf 3 Dezimalstellen zu runden. Und wenn Sie eine Dezimalzahl wollen, können Sie diesen Code verwenden:

// String to Double

var roundedString = Double(String(format: "%.3f", b))

17voto

George Filippakos Punkte 15531

Verwenden Sie die integrierte Foundation Darwin-Bibliothek

SWIFT 3

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

Verwendung:

let number:Double = 12.987654321
print(number.round(to: 3)) 

Ausgabe: 12.988

13voto

Marco Leong Punkte 563

Ein praktischer Weg kann die Verwendung einer Erweiterung vom Typ Double sein

extension Double {
    var roundTo2f: Double {return Double(round(100 *self)/100)  }
    var roundTo3f: Double {return Double(round(1000*self)/1000) }
}

Verwendung:

let regularPie:  Double = 3.14159
var smallerPie:  Double = regularPie.roundTo3f  // ergibt 3.142
var smallestPie: Double = regularPie.roundTo2f  // ergibt 3.14

12voto

Inkidu616 Punkte 399

Dies ist eine Art von langwieriger Umgehung, die nützlich sein könnte, wenn Ihre Anforderungen etwas komplexer sind. Sie können einen Zahlenformatierer in Swift verwenden.

let numberFormatter: NSNumberFormatter = {
    let nf = NSNumberFormatter()
    nf.numberStyle = .DecimalStyle
    nf.minimumFractionDigits = 0
    nf.maximumFractionDigits = 1
    return nf
}()

Angenommen, Ihre Variable, die Sie drucken möchten, ist

var printVar = 3.567

Dies stellt sicher, dass es im gewünschten Format zurückgegeben wird:

numberFormatter.StringFromNumber(printVar)

Das Ergebnis ist somit "3,6" (gerundet). Obwohl dies nicht die wirtschaftlichste Lösung ist, gebe ich sie an, weil der OP das Drucken erwähnt hat (in diesem Fall ist eine Zeichenfolge nicht unerwünscht) und weil diese Klasse es ermöglicht, mehrere Parameter festzulegen.

10voto

staticVoidMan Punkte 18082

Entweder:

  1. Verwendung von String(format:):

    • Typecast Double zu String mit dem %.3f Formatanweiser und dann zurück zu Double

      Double(String(format: "%.3f", 10.123546789))!
    • Oder erweitern Sie Double, um N-Dezimalstellen zu verarbeiten:

      extension Double {
          func rounded(toDecimalPlaces n: Int) -> Double {
              return Double(String(format: "%.\(n)f", self))!
          }
      }
  2. Durch Berechnung

    • mit 10^3 multiplizieren, runden und dann durch 10^3 teilen...

      (1000 * 10.123546789).rounded()/1000
    • Oder erweitern Sie Double, um N-Dezimalstellen zu verarbeiten:

      extension Double {    
          func rounded(toDecimalPlaces n: Int) -> Double {
              let multiplier = pow(10, Double(n))
              return (multiplier * self).rounded()/multiplier
          }
      }

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