Runden Sie doppelt auf 2 Dezimalstellen auf

85

Wie runde ich currentRatioauf zwei Dezimalstellen auf?

let currentRatio = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)!
railRatioLabelField.text! = "\(currentRatio)"
Del Hinds
quelle
Möchten Sie nur currentRatioauf zwei Dezimalstellen runden oder immer aufrunden? Beispiel: Wollen Sie 3.141 -> 3.14 oder 3.141 -> 3.14?
JAL
Hallo JAL, ich möchte, dass 3.149 als 3.15 angezeigt wird. 3.141 sollte jedoch 3.14 anzeigen. Vielen Dank
Del Hinds
Siehe den ersten Teil meiner Antwort für die korrekte Rundung.
JAL

Antworten:

171

Verwenden Sie eine Formatzeichenfolge, um auf zwei Dezimalstellen aufzurunden und die folgende doublezu konvertieren String:

let currentRatio = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)!
railRatioLabelField.text! = String(format: "%.2f", currentRatio)

Beispiel:

let myDouble = 3.141
let doubleStr = String(format: "%.2f", myDouble) // "3.14"

Wenn Sie Ihre letzte Dezimalstelle aufrunden möchten, können Sie Folgendes tun (danke Phoen1xUK):

let myDouble = 3.141
let doubleStr = String(format: "%.2f", ceil(myDouble*100)/100) // "3.15"
JAL
quelle
Muss 3,15 sein, wenn auf zwei Dezimalstellen gerundet wird.
Matt Le Fleur
Ich dachte, das OP wollte nur auf zwei Dezimalstellen runden und nach Bedarf auf- oder abrunden. Ich habe gerade einen Kommentar hinzugefügt, der um Klarstellung bittet.
JAL
Hallo Jal, danke, ich habe deine Antwort verwendet, die mit einer geringfügigen Änderung wie folgt funktioniert hat: - _ = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)! railRatioLabelField.text! = String (Format: "% .2f", currentRatio)
Del Hinds
2
Diese Antwort bezieht sich auf die Frage: "So zeigen Sie Double mit zwei Ziffern in der Textbezeichnung an" oder "... als Zeichenfolge". Diese Antwort beantwortet nicht die Frage "Double auf 2 Dezimalstellen aufrunden"
Mnl
@ JAL ich brauche olny .5 oder 0 nach Punkt Zum Beispiel. Wenn wir 23,4 haben, sollte es 23,5 geben und wenn 23,8 sollte es 24,0 sein
Guru
29

(Swift 4.2 Xcode 11) Einfach zu verwendende Erweiterung: -

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

Verwenden:-

if let distanceDb = Double(strDistance) {
   cell.lblDistance.text = "\(distanceDb.round(to:2)) km"
}
Mehul
quelle
Brillant. Ich wollte eigentlich in die gleiche Eigenschaft konvertieren (doppelt). Ihre Erweiterung hat mein Problem gelöst. Vielen Dank!
Marcelo dos Santos
:-) Happy Coding
Mehul
Ich denke, deine ist die richtige Antwort. Ich möchte der Funktion nur eine Syntaxänderung hinzufügen. func round(to places: Int) -> Double {
23.
1
@ 23inhouse, ich habe die Antwort gemäß Ihren Vorschlägen aktualisiert. Danke
Mehul
28

Aktualisiert auf SWIFT 4 und die richtige Antwort auf die Frage

Wenn Sie auf 2 Dezimalstellen aufrunden möchten, sollten Sie mit 100 multiplizieren, dann abrunden und dann durch 100 dividieren

var x = 1.5657676754 
var y = (x*100).rounded()/100
print(y)  // 1.57 
Chetan Rajagiri
quelle
1
Hallo, ich verstehe nicht, wie Sie Ihre Berechnung durchführen, um eine bestimmte Anzahl von Dezimalstellen zurückzugeben. Was ist, wenn ich möchte, dass 3 Dezimalstellen zurückgegeben werden?
Sipho Koza
@SiphoKoza multiplizieren Sie es einfach mit 1000 und dividieren Sie dann durch 1000
Chetan Rajagiri
Dies ist nicht wirklich die "richtige" Antwort, da die Zahl intern im Gleitkomma gespeichert wird, mit der Basis 2, und Sie versuchen, eine Basis 10-Zahl darzustellen. Für einige Zahlen gibt es keine genaue Darstellung, und Sie erhalten zu viele Ziffern, wenn Sie den Wert drucken. Die richtige Antwort sollte eine Zeichenfolge zurückgeben, keine Double oder Float.
Victor Engel
@levan Es funktioniert auch für Null, stellen Sie nur sicher, dass es ein Doppel ist
Chetan Rajagiri
1
Tolle Antwort, ich denke, dass dies die akzeptierte sein sollte.
ih orihpt
13

Erwägen Sie die Verwendung von NumberFormatter für diesen Zweck. Es bietet mehr Flexibilität, wenn Sie das Prozentzeichen des Verhältnisses drucken möchten oder wenn Sie Dinge wie Währung und große Zahlen haben.

let amount = 10.000001
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
let formattedAmount = formatter.string(from: amount as NSNumber)! 
print(formattedAmount) // 10
Michael Yagudaev
quelle
11

Wenn wir die obige Antwort hinzufügen und Double mehrmals formatieren möchten, können wir die Protokollerweiterung von Double wie folgt verwenden:

extension Double {
    var dollarString:String {
        return String(format: "$%.2f", self)
    }
}

let a = 45.666

print(a.dollarString) //will print "$45.67"
Ankit garg
quelle
1
Sollte nicht gedruckt werden (a.dollarString)?
glm4
5

Der Code für bestimmte Ziffern nach Dezimalstellen lautet:

var roundedString = String(format: "%.2f", currentRatio)

Hier weist% .2f den Swift an, diese Zahl auf 2 Dezimalstellen zu runden.

Merichle
quelle
4

@Rounded , Ein schneller 5.1 Property Wrapper Beispiel:

struct GameResult {
    @Rounded(rule: NSDecimalNumber.RoundingMode.up,scale: 4)
    var score: Decimal
}

var result = GameResult()
result.score = 3.14159265358979
print(result.score) // 3.1416
Abhijith
quelle
2
String(format: "%.2f", Double(round(1000*34.578)/1000))

Ausgabe: 34,58

Shobhit C.
quelle
0

Nur eine kurze Antwort für Noobs wie mich:

Sie können die anderen Antworten sehr einfach umsetzbar machen, indem Sie eine Funktion mit einer Ausgabe verwenden . Z.B

  func twoDecimals(number: Float) -> String{
    return String(format: "%.2f", number)
}

Auf diese Weise geben Sie immer dann ein, wenn Sie einen Wert mit 2 Dezimalstellen erfassen möchten

twoDecimals (' Ihre Nummer hier ')

...

Simples!

Ps Sie können auch festlegen, dass ein Float- Wert oder ein beliebiger Wert zurückgegeben wird, indem Sie ihn nach der String-Konvertierung wie folgt erneut konvertieren:

 func twoDecimals(number: Float) -> Float{
    let stringValue = String(format: "%.2f", number)
    return Float(stringValue)!
}

Hoffentlich hilft das.

Dave Y.
quelle
-1

Wenn Sie es 234.545332233 geben, erhalten Sie 234.54

let textData = Double(myTextField.text!)!
let text = String(format: "%.2f", arguments: [textData])
mylabel.text = text
Akbar Khan
quelle
-3

Nur eine einzige Codezeile:

 let obj = self.arrayResult[indexPath.row]
 let str = String(format: "%.2f", arguments: [Double((obj.mainWeight)!)!])
Mr.Javed Multani
quelle