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.