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?

8voto

Dies ist ein flexiblerer Algorithmus zum Runden auf N signifikante Stellen

Swift 3 Lösung

extension Double {
// Rundet die Double-Zahl auf 'Stellen' signifikante Ziffern
  func roundTo(places:Int) -> Double {
      guard self != 0.0 else {
          return 0
      }
      let divisor = pow(10.0, Double(places) - ceil(log10(fabs(self))))
      return (self * divisor).rounded() / divisor
  }
}

// Double(0.123456789).roundTo(places: 2) = 0.12
// Double(1.23456789).roundTo(places: 2) = 1.2
// Double(1234.56789).roundTo(places: 2) = 1200

8voto

Ayman Badr Punkte 81

Runden Sie einen Double-Wert auf x Dezimalstellen
Anzahl der Nachkommastellen

var x = 1.5657676754
var y = (x*10000).gerundet()/10000
print(y)  // 1.5658 

var x = 1.5657676754
var y = (x*100).gerundet()/100
print(y)  // 1.57 

var x = 1.5657676754
var y = (x*10).gerundet()/10
print(y)  // 1.6

8voto

Cable W Punkte 495

Zur einfacheren Verwendung habe ich eine Erweiterung erstellt:

extension Double {
    var threeDigits: Double {
        return (self * 1000).rounded(.toNearestOrEven) / 1000
    }

    var twoDigits: Double {
        return (self * 100).rounded(.toNearestOrEven) / 100
    }

    var oneDigit: Double {
        return (self * 10).rounded(.toNearestOrEven) / 10
    }
}

var myDouble = 0.12345
print(myDouble.threeDigits)
print(myDouble.twoDigits)
print(myDouble.oneDigit)

Die Druckergebnisse sind:

0.123
0.12
0.1

Vielen Dank für die Inspiration durch andere Antworten!

8voto

Ich würde verwenden

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

und ändern Sie .3f auf die Anzahl der Dezimalstellen, die Sie benötigen

7voto

Abuzar Manzoor Punkte 379

Der beste Weg, eine Double-Eigenschaft zu formatieren, besteht darin, die vordefinierten Apple-Methoden zu verwenden.

mutating func round(_ rule: FloatingPointRoundingRule)

FloatingPointRoundingRule ist ein enum, das folgende Möglichkeiten bietet

Aufzählungsfälle:

case awayFromZero Runden Sie auf den am nächsten erlaubten Wert, dessen Betrag größer oder gleich dem der Quelle ist.

case down Runden Sie auf den am nächsten erlaubten Wert, der kleiner oder gleich der Quelle ist.

case toNearestOrAwayFromZero Runden Sie auf den nächstgelegenen erlaubten Wert; Wenn zwei Werte gleich nah sind, wird der mit größerem Betrag ausgewählt.

case toNearestOrEven Runden Sie auf den nächstgelegenen erlaubten Wert; Wenn zwei Werte gleich nah sind, wird der gerade ausgewählt.

case towardZero Runden Sie auf den am nächsten erlaubten Wert, dessen Betrag kleiner oder gleich dem der Quelle ist.

case up Runden Sie auf den am nächsten erlaubten Wert, der größer oder gleich der Quelle ist.

var aNumber : Double = 5.2
aNumber.rounded(.up) // 6.0

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