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

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

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

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 

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

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"

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.


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

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

Salida: 34,58


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.


-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

-3

Solo una línea de código:

 let obj = self.arrayResult[indexPath.row]
 let str = String(format: "%.2f", arguments: [Double((obj.mainWeight)!)!])
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.