¿Alguien puede decirme cómo redondear un valor doble a x número de decimales en Swift?
Yo tengo:
var totalWorkTimeInHours = (totalWorkTime/60/60)
Con totalWorkTimeser un NSTimeInterval (doble) en segundo.
totalWorkTimeInHours me dará las horas, pero me da la cantidad de tiempo en un número tan largo y preciso, por ejemplo, 1.543240952039 ......
¿Cómo redondeo esto a, digamos, 1.543 cuando imprimo totalWorkTimeInHours?
                    
                        ios
                                swift
                                double
                                nstimeinterval
                                
                    
                    
                        Leighton
fuente
                
                fuente

round(_:),Doubleround(),NSStringinicializador,Stringinicializador,NumberFormatter, extensión doble o inclusoNSDecimalNumbereDecimal.Respuestas:
Puede usar la
roundfunción de Swift para lograr esto.Para redondear una
Doubleprecisión de 3 dígitos, primero multiplíquela por 1000, redondee y divida el resultado redondeado por 1000:Aparte de cualquier tipo de
printf(...)oString(format: ...)soluciones, el resultado de esta operación sigue siendo de tipoDouble.EDITAR: con
respecto a los comentarios que a veces no funciona, lea esto:
Lo que todo programador debe saber sobre la aritmética de coma flotante
fuente
let rate = 9.94999999999; Double(round(rate * 100) / 100);Salida:9.94999999999, 9.949999999999999solo funciona para imprimir, pero ¿cómo puedo asignarlo a variable?Extensión para Swift 2
Una solución más general es la siguiente extensión, que funciona con Swift 2 y iOS 9:
Extensión para Swift 3
En Swift 3
roundse reemplaza porrounded:Ejemplo que devuelve Doble redondeado a 4 decimales:
fuente
round(8.46 * pow(10.0, 3.0)) / pow(10.0, 3.0)retornos8.460000000000001. Hacer lo mismo con Float, al menos en este escenario , de hecho parece funcionar:round(Float(8.46) * pow(10.0, 3.0)) / pow(10.0, 3.0)rendimientos8.46. Solo algo digno de mención.No '*' candidates produce the expected contextual result type 'FloatingPointRoundingRule'Para redondear
totalWorkTimeInHoursa 3 dígitos para imprimir, use elStringconstructor que toma unaformatcadena:fuente
String(format: "%.3f", 1.23489)imprime1.235Con Swift 5, según sus necesidades, puede elegir uno de los 9 estilos siguientes para obtener un resultado redondeado de a
Double.# 1 Utilizando
FloatingPointrounded()métodoEn el caso más simple, puede usar el
Doublerounded()método.# 2 Utilizando el
FloatingPointrounded(_:)método# 3 Usando Darwin
roundfunciónFoundation ofrece una
roundfunción a través de Darwin.# 4. Usando un
Doublemétodo personalizado de extensión construido con DarwinroundypowfuncionesSi desea repetir la operación anterior muchas veces, refactorizar su código puede ser una buena idea.
# 5. Utilizando el
NSDecimalNumberrounding(accordingToBehavior:)métodoSi es necesario,
NSDecimalNumberofrece una solución detallada pero poderosa para redondear números decimales.# 6. Usando la
NSDecimalRound(_:_:_:_:)función# 7. Usando
NSStringinit(format:arguments:)inicializadorSi desea devolver un a
NSStringpartir de su operación de redondeo, el uso deNSStringinitializer es una solución simple pero eficiente.# 8. Usando
Stringinit(format:_:)inicializadorEl
Stringtipo de Swift se une con laNSStringclase de Foundation . Por lo tanto, puede usar el siguiente código para devolver unStringde su operación de redondeo:# 9. Utilizando
NumberFormatterSi espera obtener un resultado
String?de su operación de redondeo,NumberFormatterofrece una solución altamente personalizable.fuente
Decimal, que es un puente gratuitoNSDecimalNumber.Decimales tipo y ofertas nativa de Swift más elegante apoyo a los operadores nativos como+,-, etc.NSDecimalRound(_:_:_:_:)función. Gracias.NumberFormatteres la última opción, aunque debería ser la primera para presentar números a los usuarios. Ningún otro método genera números adecuadamente localizados.En Swift 2.0 y Xcode 7.2:
Ejemplo:
fuente
Este es un código completamente trabajado
Swift 3.0 / 4.0 / 5.0, Xcode 9.0 GM / 9.2 y superior
salida - 123
salida - 123.3
salida - 123.33
salida - 123.326
fuente
Basándose en la respuesta de Yogi, aquí hay una función Swift que hace el trabajo:
fuente
En Swift 3.0 y Xcode 8.0:
Use esta extensión así:
fuente
Swift 4, Xcode 10
fuente
El código para dígitos específicos después de decimales es:
Aquí el% .3f le dice a swift que redondee este número a 3 decimales. Y si desea un número doble, puede usar este código:
var roundedString = Double(String(format: "%.3f", b))fuente
Utilice la biblioteca integrada de Foundation Darwin
SWIFT 3
Uso:
Salidas: 12.988
fuente
Una manera práctica puede ser el uso de la extensión de tipo Doble
Uso:
fuente
Si desea redondear los
Doublevalores, es posible que desee utilizar SwiftDecimalpara no introducir ningún error que pueda surgir al intentar hacer cálculos matemáticos con estos valores redondeados. Si lo usaDecimal, puede representar con precisión los valores decimales de ese valor de punto flotante redondeado.Entonces puedes hacer:
Luego, puede obtener el
Decimalvalor redondeado de esta manera:Y si desea mostrarlo con un número específico de lugares decimales (así como localizar la cadena para la configuración regional actual del usuario), puede usar un
NumberFormatter:fuente
(4.81).roundedDecimal(to: 2, mode: .down)devolverá 4.8 en lugar de 4.81,Decimal(string: self.description)!decimalValueDouble(se convierte4.8099999999999996). Pero aconsejaría no usardescription(ya que el redondeo que emplea no está documentado y está sujeto a cambios). Si realmente quieres estar haciendo cálculos con precisión decimal, debes evitarlos porDoublecompleto y en su lugar debes usarlosDecimaldirectamente (por ejemplo,Decimal(sign: .plus, exponent: -2, significand: 481)oDecimal(string: "4.81"). Pero no los usesdescription.)descriptionmétodo no está documentado ni garantizado. Además, no está localizado. En mi humilde opinión, es un error utilizardescriptionpara cualquier otra cosa que no sea el registro. Lo usaríaDecimaltodo, evitando usarlo porDoublecompleto, o simplemente usaría un modo de redondeo diferente. O, si es necesario, use su propio método localizado que use el algoritmo de estilo Grisu (pero eso parece innecesario cuando sabe cuántos decimales desea redondear). Pero evitaría confiar en este comportamiento auxiliar dedescription.Esta es una especie de solución temporal larga, que puede ser útil si sus necesidades son un poco más complejas. Puede usar un formateador de números en Swift.
Suponga que su variable que desea imprimir es
Esto asegurará que se devuelva en el formato deseado:
El resultado aquí será "3.6" (redondeado). Si bien esta no es la solución más económica, la doy porque el OP mencionó la impresión (en cuyo caso, una Cadena no es indeseable), y porque esta clase permite establecer múltiples parámetros.
fuente
yo usaría
y cambie .3f a cualquier número de números decimales que necesite
fuente
Ya sea:
Utilizando
String(format:):Escribir
Doublea máquinaStringcon%.3fespecificador de formato y luego volver aDoubleO extienda
Doublepara manejar lugares N-Decimales:Por cálculo
multiplica con 10 ^ 3, redondea y luego divide por 10 ^ 3 ...
O extienda
Doublepara manejar lugares N-Decimales:fuente
Este es un algoritmo más flexible de redondeo a N dígitos significativos
Solución Swift 3
fuente
La mejor manera de formatear una propiedad doble es utilizar los métodos predefinidos de Apple.
FloatingPointRoundingRule es una enumeración que tiene las siguientes posibilidades
Casos de enumeración:
case awayFromZero Redondea al valor permitido más cercano cuya magnitud es mayor o igual que la de la fuente.
caso abajo Redondear al valor permitido más cercano que sea menor o igual que la fuente.
case toNearestOrAwayFromZero Round al valor permitido más cercano; Si dos valores son igualmente cercanos, se elige el de mayor magnitud.
caso toNearestOrEven Round al valor permitido más cercano; Si dos valores son igualmente cercanos, se elige el par.
caso hacia cero Redondea al valor permitido más cercano cuya magnitud es menor o igual que la de la fuente.
caso arriba Redondea al valor permitido más cercano que sea mayor o igual que la fuente.
fuente
redondea un valor doble a x número de
NO decimal . de dígitos después del decimal
fuente
No Swift, pero estoy seguro de que tienes la idea.
fuente
Esto parece funcionar en Swift 5.
Bastante sorprendido ya no hay una función estándar para esto.
// Truncamiento de dobles a n-decimales con redondeo
fuente
Puedes agregar esta extensión:
y llámalo así:
fuente
Para evitar imperfecciones de flotación, use Decimal
ex.
1075.58 se redondea a 1075.57 cuando se usa Float con escala: 2 y .down
1075.58 se redondea a 1075.58 cuando se usa Decimal con escala: 2 y .down
fuente
Encontré esto preguntándome si es posible corregir la entrada de un usuario. Es decir, si ingresan tres decimales en lugar de dos por un monto en dólares. Digamos 1.111 en lugar de 1.11, ¿puedes arreglarlo redondeando? ¡La respuesta por muchas razones es no! Con dinero por encima de 0.001 eventualmente causaría problemas en una chequera real.
Aquí hay una función para verificar la entrada de los usuarios para demasiados valores después del período. Pero lo que permitirá 1., 1.1 y 1.11.
Se supone que el valor ya se ha verificado para una conversión exitosa de una Cadena a una Doble.
fuente
fuente
Uso:
fuente
Aquí hay uno para SwiftUI si necesita un elemento de texto con el valor numérico.
fuente