Получение десятичной части двойника в Swift

Я пытаюсь разделить десятичные и целые части двойника в 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

Есть ли способ получить 0.5678 вместо 0.567800000000034 без преобразования числа в строку?

Ответ 1

Без преобразования его в строку вы можете округлить до нескольких десятичных знаков следующим образом:

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

Ваш результат будет

0,5678

Ответ 2

Вы можете использовать truncatingRemainder и 1 в качестве разделителя.

Возвращает оставшуюся часть этого значения, деленное на заданное значение, с помощью усеченного деления.

Apple doc

Пример:

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

Ответ 3

Swift 2:

Вы можете использовать:

modf(x).1

или

x % floor(abs(x))

Ответ 4

Используйте Float, поскольку он имеет меньше цифр точности, чем Double

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

Ответ 5

Тот же подход, что и Алессандро Орнано, реализованный как свойство экземпляра протокола 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

Ответ 6

Вы можете получить часть Integer следующим образом:

let d: Double = 1.23456e12

let intparttruncated = trunc(d)
let intpartroundlower = Int(d)

Функция trunc() усекает деталь после десятичной точки, а функция Int() округляет до следующего более низкого значения. Это то же самое для положительных чисел, но разница для отрицательных чисел. Если вы вычтите усеченную часть из d, то вы получите дробную часть.

func frac (_ v: Double) -> Double
{
    return (v - trunc(v))
}

Вы можете получить Mantissa и Exponent двойного значения следующим образом:

let d: Double = 1.23456e78

let exponent = trunc(log(d) / log(10.0))

let mantissa = d / pow(10, trunc(log(d) / log(10.0)))

Ваш результат будет 78 для экспоненты и 1.23456 для Мантиссы.

Надеюсь, это поможет вам.