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.