Redondeo de Double en Swift: 5 mejores prácticas 2025

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué redondear Double en Swift es un dolor (y cómo vivir con ello en 2025)



Todo desarrollador iOS, tarde o temprano, se enfrenta a esta situación: necesita mostrar al usuario el precio de un producto 99.99, pero en el código aparece 99.99000000000001. ¿Te suena? Bienvenido al mundo del redondeo de Double en Swift, un tema que ha acumulado miles de visitas en Stack Overflow y que sigue dando que pensar incluso en 2025.



El problema no es Swift, sino la propia naturaleza de los números de punto flotante (IEEE 754). Double no puede representar exactamente 0.1, al igual que 1/3 en el sistema decimal. Pero para el usuario, eso no es una excusa. Necesita ver cifras claras en la pantalla.



En este artículo, te mostraré 5 formas probadas de redondear Double en Swift, analizaré sus ventajas y desventajas, y te daré un algoritmo claro para elegir la mejor según tu tarea. ¡Allá vamos!



Método 1: Foundation — round() + pow(10, n) — el clásico del género



La forma más obvia que viene a la mente: multiplicar el número por 10^n, redondear y dividir de nuevo.



import Foundation

func roundDouble(_ value: Double, toPlaces places: Int) -> Double { let divisor = pow(10.0, Double(places)) return round(value * divisor) / divisor}

let price = 99.995print(roundDouble(price, toPlaces: 2)) // 100.0 (redondeo bancario)


Ventajas:

  • Simplicidad y legibilidad
  • Funciona "de fábrica" — no se necesitan imports adicionales


Desventajas:

  • Errores de precisión — debido a Double, puede dar 99.99000000000001 en lugar de 99.99
  • Problema con el redondeo bancario — round() usa redondeo half up, que no siempre es adecuado para finanzas
  • pow(10, n) — cálculos adicionales


Este método es adecuado para redondeos aproximados en la UI, pero no para cálculos financieros.



Método 2: String(format:) — redondeo a través de cadena (el más rápido para UI)



Si tu objetivo final es mostrar el número en pantalla, ¿para qué trabajar con Double? Conviértelo directamente a cadena.



let value = 123.456789let roundedString = String(format: "%.2f", value)print(roundedString) // "123.46"

// De vuelta a Double (si es necesario)let roundedDouble = Double(roundedString) ?? 0.0


Ventajas:

  • Velocidad ultrarrápida — sin operaciones matemáticas adicionales
  • Cantidad de decimales garantizada correcta en la salida
  • Soporte de localización (separador decimal)


Desventajas:

  • El resultado es una cadena; para cálculos posteriores hay que convertir de nuevo (pérdida de precisión)
  • No es adecuado para redondeo bancario (redondeo half up por defecto)


Ideal para mostrar precios, porcentajes, calificaciones — en cualquier lugar donde la precisión de ±0.01 no sea crítica.



Método 3: NSDecimalNumber — el rey de la precisión financiera



Cuando hay dinero de por medio, Double es el enemigo. Usa NSDecimalNumber — almacena números en formato decimal sin errores de redondeo.



import Foundation

func roundDecimal(_ value: Double, toPlaces places: Int, roundingMode: NSDecimalNumber.RoundingMode = .plain) -> Double { let decimal = NSDecimalNumber(value: value) let handler = NSDecimalNumberHandler( roundingMode: roundingMode, scale: Int16(places), raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false ) return decimal.rounding(accordingToBehavior: handler).doubleValue}

let amount = 99.995print(roundDecimal(amount, toPlaces: 2, roundingMode: .bankers)) // 99.99 (¡redondeo bancario!)


Ventajas:

  • Control total sobre el redondeo — .plain, .down, .up, .b

Blogs

Book Recommendations