Arrotondare il doppio a 2 cifre decimali


88

Come faccio ad arrotondare fino currentRatioa due cifre decimali?

let currentRatio = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)!
railRatioLabelField.text! = "\(currentRatio)"

Vuoi arrotondare solo currentRatioa due cifre decimali o arrotondare sempre per eccesso? Es: vuoi 3.141 -> 3.14 o 3.141 -> 3.14?
JAL

Ciao JAL, voglio che 3.149 venga visualizzato come 3.15. Tuttavia 3.141 dovrebbe visualizzare 3.14. Grazie
Del Hinds

Vedi la prima parte della mia risposta per l'arrotondamento corretto.
JAL

Risposte:


174

Utilizza una stringa di formato per arrotondare per eccesso a due cifre decimali e converti il doublein String:

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

Esempio:

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

Se vuoi arrotondare la tua ultima cifra decimale, potresti fare qualcosa del genere (grazie Phoen1xUK):

let myDouble = 3.141
let doubleStr = String(format: "%.2f", ceil(myDouble*100)/100) // "3.15"

Deve essere 3,15 se si arrotonda fino a due cifre decimali.
Matt Le Fleur

Pensavo che l'OP volesse solo arrotondare a due cifre decimali, arrotondando per eccesso o per difetto secondo necessità. Ho appena aggiunto un commento chiedendo chiarimenti.
JAL

Ciao Jal, grazie, ho usato la tua risposta che ha funzionato con una leggera modifica come segue: - _ = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)! railRatioLabelField.text! = Stringa (formato: "% .2f", currentRatio)
Del Hinds

2
Questa risposta è alla domanda: "Come visualizzare il doppio con due cifre nell'etichetta di testo" o "... come stringa", questa risposta non risponde alla domanda "Arrotondare il doppio a 2 cifre decimali"
mnl

@ JAL ho bisogno di olny .5 o 0 dopo il punto Ad es. se abbiamo 23,4 dovrebbe dare 23,5 e se 23,8 dovrebbe 24,0
guru

33

(Swift 4.2 Xcode 11) Estensione semplice da usare: -

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

Uso:-

if let distanceDb = Double(strDistance) {
   cell.lblDistance.text = "\(distanceDb.round(to:2)) km"
}

Brillante. In realtà volevo convertire nella stessa proprietà (doppia). La tua estensione ha risolto il mio problema. Grazie!
Marcelo dos Santos

:-) Happy coding
Mehul

Penso che la tua sia la risposta corretta. Vorrei solo aggiungere una modifica della sintassi al file func. func round(to places: Int) -> Double {
23inhouse

1
@ 23inhouse, ho aggiornato la risposta secondo i tuoi suggerimenti. Grazie
Mehul

29

Aggiornato a SWIFT 4 e la risposta corretta alla domanda

Se si desidera arrotondare fino a 2 cifre decimali, moltiplicare per 100, quindi arrotondarlo e quindi dividerlo per 100

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

1
Ciao - Non capisco come fai il tuo calcolo in termini di restituzione di un certo numero di decimali. Cosa succede se voglio che restituisca 3 cifre decimali?
Sipho Koza

@SiphoKoza basta moltiplicarlo per 1000 e poi dividerlo per 1000
Chetan Rajagiri

Questa non è veramente la risposta "corretta" perché internamente il numero viene salvato in virgola mobile, con è in base 2, e stai cercando di rappresentare un numero in base 10. Per alcuni numeri non c'è una rappresentazione esatta e finirai con troppe cifre quando andrai a stampare il valore. La risposta corretta dovrebbe restituire una stringa, non un Double o un Float.
Victor Engel

@levan Funziona anche per zero, assicurati solo che sia una doppia
Chetan Rajagiri

1
Ottima risposta, penso che questa dovrebbe essere quella accettata.
אורי orihpt

15

Considera l'utilizzo di NumberFormatter per questo scopo, fornisce maggiore flessibilità se vuoi stampare il segno di percentuale del rapporto o se hai cose come valuta e numeri grandi.

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

Ne ho passati molti, questa è DI GRAN LUNGA, la soluzione MIGLIORE! Grazie mille!
kalafun

13

Aggiungendo alla risposta sopra se vogliamo formattare Double più volte, possiamo usare l'estensione del protocollo di Double come di seguito:

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

let a = 45.666

print(a.dollarString) //will print "$45.67"

1
Non dovrebbe essere print (a.dollarString)?
glm4

4

Il codice per cifre specifiche dopo i decimali è:

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

Qui il% .2f dice allo swift di arrotondare questo numero a 2 cifre decimali.


4

@Rounded , Un rapido esempio di wrapper di proprietà 5.1:

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

Uscita: 34,58


2

Solo una rapida risposta di follow-up per niubbi come me:

Puoi rendere le altre risposte facilmente implementabili utilizzando una funzione con un output . Per esempio

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

In questo modo, ogni volta che vuoi prendere un valore con 2 cifre decimali devi semplicemente digitare

twoDecimals (" Il tuo numero qui ")

...

Semplici!

Ps Potresti anche fare in modo che restituisca un valore Float , o qualsiasi cosa tu voglia, convertendolo di nuovo dopo la conversione della stringa come segue:

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

Spero possa aiutare.


-1

se lo dai 234,545332233 ti darà 234,54

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

-4

Solo una singola riga di codice:

 let obj = self.arrayResult[indexPath.row]
 let str = String(format: "%.2f", arguments: [Double((obj.mainWeight)!)!])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.