Redondea el doble a 2 lugares decimales

85

¿Cómo redondeo currentRatioa dos lugares decimales?

let currentRatio = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)!
railRatioLabelField.text! = "\(currentRatio)"
Del Hinds
fuente
¿Quiere simplemente redondear currentRatioa dos lugares decimales o siempre redondear hacia arriba? Ej .: ¿quieres 3.141 -> 3.14 o 3.141 -> 3.14?
JAL
Hola JAL, quiero que 3.149 se muestre como 3.15. Sin embargo, 3.141 debería mostrar 3.14. Gracias
Del Hinds
Consulte la primera parte de mi respuesta para obtener el redondeo correcto.
JAL

Respuestas:

170

Use una cadena de formato para redondear hasta dos lugares decimales y convertir el doublea String:

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

Ejemplo:

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

Si desea redondear su último decimal, puede hacer algo como esto (gracias Phoen1xUK):

let myDouble = 3.141
let doubleStr = String(format: "%.2f", ceil(myDouble*100)/100) // "3.15"
JAL
fuente
Debe ser 3,15 si se redondea hasta dos decimales.
Matt Le Fleur
Pensé que el OP solo quería redondear a dos lugares decimales, redondeando hacia arriba o hacia abajo según sea necesario. Acabo de agregar un comentario pidiendo una aclaración.
JAL
Hola Jal, Gracias, usé tu respuesta que funcionó con una ligera modificación de la siguiente manera: - _ = Double (rxCurrentTextField.text!)! / Doble (txCurrentTextField.text!)! railRatioLabelField.text! = Cadena (formato: "% .2f", currentRatio)
Del Hinds
2
Esta respuesta es a la pregunta: "Cómo mostrar el doble con dos dígitos en la etiqueta de texto" o "... como cadena", esta respuesta no responde a la pregunta "Redondea el doble a 2 lugares decimales"
mnl
@JAL necesito olny .5 o 0 después del punto Por ej. si tenemos 23,4 debería dar 23,5 y si 23,8 debería dar 24,0
guru
29

(Swift 4.2 Xcode 11) Extensión fácil de usar: -

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

Utilizar:-

if let distanceDb = Double(strDistance) {
   cell.lblDistance.text = "\(distanceDb.round(to:2)) km"
}
Mehul
fuente
Brillante. De hecho, quería convertir a la misma propiedad (doble). Tu extensión resolvió mi problema. ¡Gracias!
Marcelo dos Santos
:-) Codificación feliz
Mehul
Creo que la tuya es la respuesta correcta. Solo me gustaría agregar una modificación de sintaxis a func. func round(to places: Int) -> Double {
23inhouse
1
@ 23inhouse, he actualizado la respuesta según sus sugerencias. Gracias
Mehul
28

Actualizado a SWIFT 4 y la respuesta adecuada a la pregunta

Si desea redondear hasta 2 lugares decimales, debe multiplicar por 100, luego redondearlo y dividirlo por 100.

var x = 1.5657676754 
var y = (x*100).rounded()/100
print(y)  // 1.57 
Chetan Rajagiri
fuente
1
Hola, no entiendo cómo haces tu cálculo en términos de devolver un cierto número de decimales. ¿Qué pasa si quiero que devuelva 3 decimales?
Sipho Koza
@SiphoKoza simplemente multiplíquelo por 1000 y luego divídalo por 1000
Chetan Rajagiri
Esta no es realmente la respuesta "correcta" porque internamente, el número se guarda en punto flotante, con es base 2, y estás tratando de representar un número base 10. Para algunos números, no hay una representación exacta y terminará con demasiados dígitos cuando imprima el valor. La respuesta adecuada debe devolver una cadena, no un Double o Float.
Victor Engel
@levan También funciona para cero, solo asegúrate de que sea un doble
Chetan Rajagiri
1
Gran respuesta, creo que esta debería ser la aceptada.
אורי orihpt
13

Considere usar NumberFormatter para este propósito, brinda más flexibilidad si desea imprimir el signo de porcentaje de la relación o si tiene cosas como moneda y números grandes.

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
fuente
11

Agregando a la respuesta anterior si queremos formatear Double varias veces, podemos usar la extensión de protocolo de Double como se muestra a continuación:

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

let a = 45.666

print(a.dollarString) //will print "$45.67"
Ankit garg
fuente
1
¿No debería imprimirse (a.dollarString)?
glm4
5

El código para dígitos específicos después de los decimales es:

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

Aquí el% .2f le dice al vencejo que redondee este número a 2 lugares decimales.

Merichle
fuente
4

@Rounded , un contenedor de propiedad rápido de 5.1 Ejemplo:

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
fuente
2
String(format: "%.2f", Double(round(1000*34.578)/1000))

Salida: 34,58

Shobhit C
fuente
0

Solo una rápida respuesta de seguimiento para novatos como yo:

Puede hacer que las otras respuestas se puedan implementar muy fácilmente utilizando una función con una salida . P.ej

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

De esta manera, siempre que desee tomar un valor con 2 decimales, simplemente escriba

twoDecimals (' Su número aquí ')

...

Simples!

Ps También puede hacer que devuelva un valor flotante , o cualquier cosa que desee, convirtiéndolo nuevamente después de la conversión de cadena de la siguiente manera:

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

Espero que ayude.

Dave Y
fuente
-1

si le da 234,545332233 le dará 234,54

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

Solo una línea de código:

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