数値の丸め方、切り捨て、切り上げmath.floor()関数 – FlyWithLua

2023年7月31日

math.floor()関数を使うと不動小数点の切り上げ、切り下げを行うことができる。四捨五入を一発でできる関数は無い。0.5をプラスして1を超えるか超えないかで切り上げ、切り下げを行っている。

切り上げ(整数に四捨五入)

math.floor()関数は丸める機能なので四捨五入ができない。単純に0.5をプラスして、その結果を表示しているだけという単純計算方式で一見、四捨五入したようにみせている。
小数点以下が増えても問題なく処理できる。

a = 4.5
b = 4.4
c = 3.5
d = 3.4
function Text_draw()
    A = math.floor(a + 0.5) --hogeの値が%d(整数)に入る
    B = math.floor(b + 0.5)
    C = math.floor(c + 0.5)
    D = math.floor(d + 0.5)
    draw_string( 100, 100, A, 0, 1, 0)
    draw_string( 100, 86, B, 0, 1, 0)
    draw_string( 100, 72, C, 0, 1, 0)
    draw_string( 100, 56, D, 0, 1, 0)
end

do_every_draw("Text_draw()")

小数点以下2桁目を四捨五入する場合

四捨五入そのものはLuaでは面倒な作業になる。
まず四捨五入する位置を取得する必要がある。114.53653の小数点以下2桁の場合は3桁目が大事に成る。114.536、つまりここでは最後の6を四捨五入するかどうかを判定するのに使う。

3行目の「A_float」は下3桁を四捨五入するためにa + 0.005と小数点以下3桁目にプラスしている。
4行目で全体の桁数を6桁にして四捨五入した小数点以下2桁を表示する。

最後の数字が3から4にちゃんと四捨五入されている。

a = 114.53653
function Text_draw()
	A_float = a + 0.005--小数点以下3桁目を四捨五入するために0.005をプラス。
	A_data = string.sub(A_float, 1, 6)--ここで小数点以下2桁を表示するように切り詰める
	draw_string( 150, 100, A_data, 0, 1, 0)
end
do_every_draw("Text_draw()")

四捨五入する位置を設定するとき、対象になる桁数に0.5をプラスすると良いことになる。
整数の場合一桁目はいいが、二桁目以降は一旦小数点にして四捨五入して整数に戻す作業に成る。

小数点以下を切り上げmath.ceil

これは四捨五入ではなく、すべて小数点以下を切り上げて整数にする。

a = 4.5
b = 4.332
c = -3.8
d = -4.1

function Text_draw()
	A_round = math.ceil(a)
	draw_string(100, 100, A_round, 0, 1, 0)
	B_round = math.ceil(b)
	draw_string(100, 87, B_round, 0, 1, 0)
	C_round = math.ceil(c)
	draw_string(100, 74, C_round, 0, 1, 0)
	D_round = math.ceil(d)
	draw_string(100, 61, D_round, 0, 1, 0)
end

do_every_draw("Text_draw()")

切り下げ

math.floor()は小数点以下を切り捨てにする。マイナスの場合は切り上げのような切り捨てになる。

function Text_draw()
	test_1 = 4.8
	test_2 = 5.3
	test_3 = -4.5
	test_4 = -5.3
	test_1 = math.floor(test_1)
	test_2 = math.floor(test_2)
	test_3 = math.floor(test_3)
	test_4 = math.floor(test_4)

	draw_string(100, 400, test_1, 0, 1, 0)
	draw_string(100, 380, test_2, 0, 1, 0)
	draw_string(100, 360, test_3, 0, 1, 0)
	draw_string(100, 340, test_4, 0, 1, 0)
end

do_every_draw("Text_draw()")

FlyWithLua付属のプログラム

alt_set_1000.lua

math.floor()切り捨ての関数がここでは使われている。1,000単位以下の小数点端数は切り捨てている。

コマンドで高度を1000単位で上げ下げすることになっているようだ
カスタムコマンドが設定されているのは分かる。キーボードに割り当ててキーを押すごとに高度を上げ下げすることができる。

-- 説明:オートパイロットの高度設定の値を増減します
-- 次の1000番目まで、より効果的な値に調整します。
-- このスクリプトを簡単に変更して、ステップサイズを変更できます。

-- オートパイロットに調整された高度を読み書きするようにdatarefALTを設定します
dataref("ALT", "sim/cockpit2/autopilot/altitude_dial_ft", "writable")

-- オートパイロットの高度値を上げるコマンドを作成する
create_command("FlyWithLua/autopilot/inc_alt_1000",
               "Increase the altitude to the next 1000 value",
               "ALT = math.floor(ALT / 1000 + 1) * 1000",
               "",
               "")

-- オートパイロットの高度値を下げるコマンドを作成する
create_command("FlyWithLua/autopilot/dec_alt_1000",
               "Decrease the altitude to the next 1000 value",
               "ALT = math.floor( (ALT - 1) / 1000) * 1000",
               "",
               "")

ファイルへに書き込みの丸め

ここでのhobbsfileはファイルに書き込みの場合に使う?。検証していない。

hobbsfile:write(math.floor(baro_setting[0] + 0.5), “\n”)

math.floorは最大の整数を取ります。つまり、123,999の場合は123です。

0.5ラウンドの以前の追加:
123.999 + 0.5 = 124.499、切り上げはそれを124に変えます
123.499 + 0.5 = 123.999、切り下げはそれを123に変えます