2015-07-14 24 views
6

Sto provando a separare le parti decimali e integer di una doppia in rapido. Ho provato un certo numero di approcci ma tutti incontrato lo stesso problema ...Ottenere la parte decimale di una doppia in Swift

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 

C'è un modo per ottenere 0,5678 invece di 0,567800000000034 senza convertire il numero in una stringa?

+0

vedere questo: http://stackoverflow.com/q/588004/1630618 – vacawama

risposta

7

senza convertirlo in una stringa, si può arrotondare fino ad un numero di cifre decimali in questo modo:

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 

L'output sarebbe

0.5678

+2

Grazie per la risposta. Questo è buono, ma sfortunatamente non funziona per me perché non conosco il numero appropriato di posti nel codice in anticipo. Credo che dovrò convertire tramite stringhe: -/ – user3925713

8

Usa Float dal momento che ha meno cifre di precisione rispetto Double

let x:Double = 1234.5678 
let n1:Float = Float(x % 1)   // n1 = 0.5678 
+0

Per la persona che downvoted, potrebbe indicare alcun motivo per cui si pensi che questa sia una cattiva risposta? – Ahmad

+0

Convertendo in 'Float' stai semplicemente buttando fuori più informazioni senza alcun beneficio: questo darà una * risposta * meno * accurata (' 0.567799985408782958984375' invece di '0.567800000000033833202905952930450439453125'). –

+0

@MarkDickinson non è ciò che l'OP voleva realizzare? – Ahmad

6

Swift 2:

È possibile utilizzare:

modf(x).1 

o

x % floor(abs(x)) 
22

È possibile utilizzare truncatingRemainder e 1 come il divisore.

Restituisce il resto di questo valore diviso per il valore specificato utilizzando la divisione troncante.

Apple doc

Esempio:

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 
+0

risposta fantastica, grazie! – Fattie

+0

semplice e preciso – DazChong