web-dev-qa-db-ja.com

Swiftでdoubleの小数部を取得する

Swiftでdoubleの小数部と整数部を分離しようとしています。私はいくつかのアプローチを試しましたが、すべて同じ問題に遭遇します...

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.567800000000034ではなく0.5678を取得する方法はありますか?

20
user3925713

文字列に変換せずに、次のように小数点以下の桁数を切り上げることができます。

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

13

truncatingRemainderおよび1を分周器として使用できます。

切り捨て除算を使用して、指定された値で除算したこの値の余りを返します。

Appleドキュメント

例:

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
70
Nico

Swift 2

以下を使用できます。

modf(x).1

または

x % floor(abs(x))
12

FloatingPointプロトコルのインスタンスプロパティとして実装されたAlessandro Ornanoと同じアプローチ:

Xcode 11•Swift 5.1

extension FloatingPoint {
    var whole: Self { modf(self).0 }
    var fraction: Self { modf(self).1 }
}

1.2.whole    // 1
1.2.fraction // 0.2
7
Leo Dabus

Floatよりも桁数が少ないため、Doubleを使用します

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

let y = Int(x) //1234

let result = x - Double(y) //1234.5678 - 1234.0 = 0.5678
0
Picode

Cの数学ライブラリと多くのプログラミング言語には関数があり、Swiftが含まれているため、それにアクセスできます。これはmodfと呼ばれ、Swiftでは次のように機能します。

// modfは2要素のタプルを返します

//最初の要素に整数部分を使用し、

// 2番目の要素の小数部

splitPi = modf(3.141592)とする

splitPi.0 // 3.

splitPi.1 // 0.141592

以下のような拡張機能を作成できます。

extension Double {

    func getWholeNumber() -> Double {

        return modf(self).0

    }

    func getFractionNumber() -> Double {

        return modf(self).1

    }

}
0
Super Xtreem

次のように整数部分を取得できます。

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

次のようにDouble値の仮数と指数を取得できます。

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になります。

これがお役に立てば幸いです。

0
j.s.com

Swift 5.1

let x:Double = 1234.5678

let decimalPart:Double = x.truncatingRemainder(dividingBy: 1)    //0.5678
let integerPart:Double = x.round(.towardZero)                   //1234

これらのメソッドはどちらもDouble値を返します。

integerPartとして整数が必要な場合は、、

Int(x)
0
Yodagama

すべてのDoublesで機能するソリューションを作成することは不可能です。そして、他の答えがうまくいったとしても、それも不可能だと私は信じていますが、もう答えはありません。

let _5678 = 1234.5678.description.drop { $0 != "." } .description // ".5678"
Double(_5678)  // 0.5678

let _567 = 1234.567.description.drop { $0 != "." } .description // ".567"
Double(_567) // 0.5669999999999999
0
Jessy