Obtener la parte decimal de un doble en Swift
math floating-accuracy (6)
Estoy tratando de separar las partes decimal y entera de un doble en swift. He intentado varios enfoques, pero todos se encuentran con el mismo problema ...
let x:Double = 1234.5678
let n1:Double = x % 1.0 // n1 = 0.567800000000034
let n2:Double = x - 1234.0 // same result
let n3:Double = modf(x, &integer) // same result
¿Hay alguna manera de obtener 0.5678 en lugar de 0.567800000000034 sin convertir el número en una cadena?
El mismo enfoque que Alessandro Ornano implementó como una propiedad de instancia del protocolo FloatingPoint:
public extension FloatingPoint {
public var whole: Self { return modf(self).0 }
public var fraction: Self { return modf(self).1 }
}
1.2.whole // 1
1.2.fraction // 0.2
Puede obtener la parte entera así:
let d: Double = 1.23456e12
let intparttruncated = trunc(d)
let intpartroundlower = Int(d)
La función trunc () trunca la parte después del punto decimal y la función Int () se redondea al siguiente valor más bajo. Esto es lo mismo para números positivos pero una diferencia para números negativos. Si resta la parte truncada de d, obtendrá la parte fraccionaria.
func frac (_ v: Double) -> Double
{
return (v - trunc(v))
}
Puede obtener Mantissa y exponente de un valor doble como este:
let d: Double = 1.23456e78
let exponent = trunc(log(d) / log(10.0))
let mantissa = d / pow(10, trunc(log(d) / log(10.0)))
Su resultado será 78 para el exponente y 1.23456 para el Mantissa.
Espero que esto te ayude.
Puede usar
truncatingRemainder
y
1
como divisor.
Devuelve el resto de este valor dividido por el valor dado usando la división truncada.
Ejemplo:
let myDouble1: Double = 12.25
let myDouble2: Double = 12.5
let myDouble3: Double = 12.75
let remainder1 = myDouble1.truncatingRemainder(dividingBy: 1)
let remainder2 = myDouble2.truncatingRemainder(dividingBy: 1)
let remainder3 = myDouble3.truncatingRemainder(dividingBy: 1)
remainder1 -> 0.25
remainder2 -> 0.5
remainder3 -> 0.75
Sin convertirlo en una cadena, puede redondear a un número de decimales como este:
let x:Double = 1234.5678
let numberOfPlaces:Double = 4.0
let powerOfTen:Double = pow(10.0, numberOfPlaces)
let targetedDecimalPlaces:Double = round((x % 1.0) * powerOfTen) / powerOfTen
Su salida sería
0,5678
Use
Float
ya que tiene menos dígitos de precisión que
Double
let x:Double = 1234.5678
let n1:Float = Float(x % 1) // n1 = 0.5678
Swift 2 :
Puedes usar:
modf(x).1
o
x % floor(abs(x))