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)"

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"

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"
}

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 

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

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"

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.


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

2
String(format: "%.2f", Double(round(1000*34.578)/1000))

Ausgabe: 34,58


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.


-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

-3

Nur eine einzige Codezeile:

 let obj = self.arrayResult[indexPath.row]
 let str = String(format: "%.2f", arguments: [Double((obj.mainWeight)!)!])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.