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を取得する方法はありますか?
文字列に変換せずに、次のように小数点以下の桁数を切り上げることができます。
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
truncatingRemainder
および1
を分周器として使用できます。
切り捨て除算を使用して、指定された値で除算したこの値の余りを返します。
例:
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
Swift 2:
以下を使用できます。
modf(x).1
または
x % floor(abs(x))
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
Float
よりも桁数が少ないため、Double
を使用します
let x:Double = 1234.5678
let n1:Float = Float(x % 1) // n1 = 0.5678
let x:Double = 1234.5678
let y = Int(x) //1234
let result = x - Double(y) //1234.5678 - 1234.0 = 0.5678
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
}
}
次のように整数部分を取得できます。
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になります。
これがお役に立てば幸いです。
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)
すべての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