hiro99ma blog

何か技術的なこと

kotlin: ceil や floor

2024/10/11

昔から、といっても私も詳しく知らないが、少なくとも C言語から ceilfloor だった。
実は私はあまり使ったことが無い。 昔は浮動小数点演算を持ってないため小数を扱うとライブラリが演算するので遅かったから極力使わないようにしていたのだ。
使うときも関数呼び出しにコストがかかるから int でキャストして切り捨てたり +0.9 とかでほどほどに切り上げたりしてたような気がする。 固定小数点も使っていたような。。。

まあ、昔のことは忘れよう。
Android のチュートリアルで「round up」が出てきて、そういえばどういう計算になるんだったか不安になったので確認した。

fun calc(value: Double) {
    println("value=$value")
    println("  ceil=${kotlin.math.ceil(value)}")
    println("  floor=${kotlin.math.floor(value)}")
    println("  round=${kotlin.math.round(value)}")
    println("  toInt=${value.toInt()}")
}

fun main() {
    calc(1.2)
    calc(-1.2)
}

Kotlin PlayGround

図にするとこんな感じ。
round()は整数値への近さが影響するが、それ以外は数値の大きい方か小さい方に移動するだけになる。 なお、round()で値が中央だった場合 C言語ではゼロから遠い方になるそうだ。つまり四捨五入でこれも kotlin と同じだ。

image

「四捨五入」は文字を見てわかるけど、”round” だとわからんね。 そもそも四捨五入の概念は世界共通なのだろうか? 麻雀だと五捨六入だったと思う。

toInt()はC言語でのintキャストと同じで、絶対値にして小数点以下を切り捨てて符号を戻す、という動作だった。 ゼロの方向の整数にすると言えばよいか。

Excelの場合

Excel もだいたい同じなのだが追加のパラメータが付けられたりする。
またINT()の挙動がintのキャストとは違った。 パラメータ無しのCEILING()と同じになるのかな。

image

< Top page