【Kotlin】小数点の切り上げ/切り捨て/四捨五入方法!第2位などの桁数
この記事からわかること
- Android Studio/Kotlinで浮動小数点数型の値を切り上げ/切り捨て/四捨五入する方法
- ceil/floor/round関数の使い方
- 小数点第2位や3位など任意の桁数で丸め処理
- 文字列型に変換して小数点の表示桁数を調整する方法
- formatメソッドの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Kotlinで浮動小数点数型の値を切り上げ/切り捨て/四捨五入する方法をまとめていきたいと思います。
Kotlinで浮動小数点数を扱うデータ型の違い
Kotlinでは数値(浮動小数点数)を扱うデータ型は複数存在します。
Swiftの浮動小数点数データ型
型名 | 概要 | 例 |
---|---|---|
Int | 整数型 | 23 |
Float | 32ビット浮動小数点数型(小数点7桁まで) | 3.1415927 |
Double | 64ビット浮動小数点数型(小数点15桁まで) | 3.141592653589793 |
数値を扱うという点では同じですが、データ型が異なるので許容していない範囲の数値を格納するとエラーになってしまいます。浮動小数点数型に関しては許容外の桁数を渡されると自動で収まる桁数に丸められます。またFloat
型を指定する場合は末尾にf
を付与します。
var numI: Int = 3.141592653589793238462643 // エラー
var numF: Float = 3.141592653589793238462643f // 許容できる範囲に自動で丸められる
var numD: Double = 3.141592653589793238462643 // 許容できる範囲に自動で丸められる
println(numI) // The floating-point literal does not conform to the expected type Int
println(numF) // 3.1415927
println(numD) // 3.141592653589793
FloatとDoubleの違い
同じ浮動小数点数型であるFloat
とDouble
の違いは許容できる桁数の違いです。変数初期格納時に許容外の桁数を渡しても問題はありませんが異なるデータ型を受け入れられるわけではありません。
var numF: Float = 3.141592653589793238462643f
var numD: Double = 3.141592653589793238462643
numD = numF // エラー
// Type mismatch: inferred type is Float but Double was expected
浮動小数点数型の値を丸め処理する関数
Kotlinでは浮動小数点数型の値に対して小数点以下を丸めることができる関数が用意されています。
- ceil:切り上げ
- floor:切り捨て
- round:四捨五入
import kotlin.math.ceil
import kotlin.math.floor
import kotlin.math.round
val num: Double = 5.6
val ceilNum = ceil(num) // 6.0
val floorNum = floor(num) // 5.0
val roundNum = round(num) // 6.0
小数点第2位や3位など任意の桁数で丸め処理
Kotlinで用意されている関数は小数点の位の丸め位置を指定することはできません。例えば小数点第2位で四捨五入をしたい時は「10倍してから丸めて10で割る(桁をずらす)」ことで桁解決できます。
val num: Double = 3.141592653589793238462643
val numCeil = ceil(num * 10) / 10 // 3.2
val numFloor = floor(num * 100) / 100 // 3.14
val numRound = round(num * 1000) / 1000 // 3.142
小数点の位置をずらすことで任意の桁数で丸め処理を行うことができます。またそれにより表示させたい小数点以下の桁数をコントロールすることもできます。
文字列型に変換して小数点の表示桁数を調整
小数点以下の桁数の表示数を調整する際に便利なのがformat
メソッドです。表示させたい桁数の形式から呼び出し、引数に対象の値を渡します。
val num: Double = 3.141592653589793238462643
println("%.1f".format(num)) // 3.1
println("%.3f".format(num)) // 3.142
println("%.5f".format(num)) // 3.14159
「表示させたい小数点の桁数の形式」はフォーマット指定子と呼ばれる形式を指定します。その中で浮動小数点数型を指定する際は%.nf
(nに桁数)で指定します。
数値の0埋め
ちなみにString(format:)
イニシャライザで%0nd
を使うと数値の0埋めをすることもできます。指定した桁数に足りていない桁に0を入れてくれます。
val num: Int = 1
println("%02d".format(num)) // 01
println("%03d".format(num)) // 001
println("%05d".format(num)) // 00001
割り算で小数点にならず0になる
Kotlinで数値の割り算をしていた際になぜか結果が0になってしまう現象が起きました。
var five = 5
var ten = 10
println(five/ten) // 0
この原因はInt
型であることでした。計算対象のfive
とten
は型推論によりInt
型が割り当てられており、Int
同士の計算だったので結果が小数点になってもサポート外になっていたようです。なので明示的にDouble
を指定することで解決しました。
var five: Double = 5.0
var ten: Double = 10.0
print(five/ten) // 0.5
Swiftでの小数点の取り扱いはこちら
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。