¿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 totalWorkTime
ser 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(_:)
,Double
round()
,NSString
inicializador,String
inicializador,NumberFormatter
, extensión doble o inclusoNSDecimalNumber
eDecimal
.Respuestas:
Puede usar la
round
función de Swift para lograr esto.Para redondear una
Double
precisió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.949999999999999
solo 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
round
se 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
totalWorkTimeInHours
a 3 dígitos para imprimir, use elString
constructor que toma unaformat
cadena:fuente
String(format: "%.3f", 1.23489)
imprime1.235
Con Swift 5, según sus necesidades, puede elegir uno de los 9 estilos siguientes para obtener un resultado redondeado de a
Double
.# 1 Utilizando
FloatingPoint
rounded()
métodoEn el caso más simple, puede usar el
Double
rounded()
método.# 2 Utilizando el
FloatingPoint
rounded(_:)
método# 3 Usando Darwin
round
funciónFoundation ofrece una
round
función a través de Darwin.# 4. Usando un
Double
método personalizado de extensión construido con Darwinround
ypow
funcionesSi desea repetir la operación anterior muchas veces, refactorizar su código puede ser una buena idea.
# 5. Utilizando el
NSDecimalNumber
rounding(accordingToBehavior:)
métodoSi es necesario,
NSDecimalNumber
ofrece una solución detallada pero poderosa para redondear números decimales.# 6. Usando la
NSDecimalRound(_:_:_:_:)
función# 7. Usando
NSString
init(format:arguments:)
inicializadorSi desea devolver un a
NSString
partir de su operación de redondeo, el uso deNSString
initializer es una solución simple pero eficiente.# 8. Usando
String
init(format:_:)
inicializadorEl
String
tipo de Swift se une con laNSString
clase de Foundation . Por lo tanto, puede usar el siguiente código para devolver unString
de su operación de redondeo:# 9. Utilizando
NumberFormatter
Si espera obtener un resultado
String?
de su operación de redondeo,NumberFormatter
ofrece una solución altamente personalizable.fuente
Decimal
, que es un puente gratuitoNSDecimalNumber
.Decimal
es tipo y ofertas nativa de Swift más elegante apoyo a los operadores nativos como+
,-
, etc.NSDecimalRound(_:_:_:_:)
función. Gracias.NumberFormatter
es 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
Double
valores, es posible que desee utilizar SwiftDecimal
para 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
Decimal
valor 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)!
decimalValue
Double
(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 porDouble
completo y en su lugar debes usarlosDecimal
directamente (por ejemplo,Decimal(sign: .plus, exponent: -2, significand: 481)
oDecimal(string: "4.81")
. Pero no los usesdescription
.)description
método no está documentado ni garantizado. Además, no está localizado. En mi humilde opinión, es un error utilizardescription
para cualquier otra cosa que no sea el registro. Lo usaríaDecimal
todo, evitando usarlo porDouble
completo, 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
Double
a máquinaString
con%.3f
especificador de formato y luego volver aDouble
O extienda
Double
para manejar lugares N-Decimales:Por cálculo
multiplica con 10 ^ 3, redondea y luego divide por 10 ^ 3 ...
O extienda
Double
para 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