このページでは、FloatやDouble型の数値に小数が含まれるかどうかを判別する方法を紹介します。
実装方法
STEP1. 小数部分の抜き出し
まずは truncatingRemainder を使って小数部分を抜き出さします。
let decimal = result.truncatingRemainder(dividingBy: 1)
// 例
resultの値:123.45 → decimalの値:0.45
resultの値:123 → decimalの値:0.0
上記の例のようにresultが小数を含む場合は小数部分が取得でき、含まない場合の結果は0.0となります。
truncatingRemainder(dividingBy:)のドキュメント
STEP2. 小数部分が0より大きいか比較
次の取り出した小数部分が0よりも大きいのか比較します。
0よりも大きければ小数点を含むということになります。
比較には is
let decimal = result.truncatingRemainder(dividingBy: 1)
if decimal.truncatingRemainder(dividingBy: 1).isLess(than: .ulpOfOne) {
print("小数なし")
} else {
print("小数あり")
}
isLess(than:)は指定した引数の数値よりも小さいかどうかをチェックしてくれるメソッドで、結果をBool値で返します。
浮動小数点のイコールチェックにはEPSILONを使いますが、Swiftでは「.ulpOfOne」と書くので、引数に「.ulpOfOne」を指定しています。
負の数も考慮する場合
先ほどの方法では、負の数を考慮していません。
そのため、チェックする数値が「-12.345」だったとすると、
小数部分の抜き出し結果:-0.345
isLess(than:)の結果:true
となり、小数があるのに、小数が無いと判定されてしまいます。
これを防ぐには、abs(_:) を使って絶対値を算出(マイナスを取り除く)してから、isLess(than:)でチェックをすればOKです。
let decimal = result.truncatingRemainder(dividingBy: 1)
if abs(decimal.truncatingRemainder(dividingBy: 1)).isLess(than: .ulpOfOne) {
print("小数なし")
} else {
print("小数あり")
}