swift math floating-accuracy

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.

Documento de Apple

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))