四捨五入関数
以前に何処かに書いて,コメントももらっていたのが行方不明になっていました。
新たに頂いたコメントに基づいて,本文を追加・訂正します。
さらなるコメント,多言語による実装例等歓迎です。
Python
def shishagonyu(x, n=0):
return (-1 if x < 0 else 1 if x > 0 else 0)*int(abs(x) * 10**n + 0.5) / 10**n
(shishagonyu(5.15, 1), shishagonyu(-5.15, 1), shishagonyu(0.5), shishagonyu(-0.5))
(5.2, -5.2, 1.0, -1.0)
(shishagonyu(5.25, 1), shishagonyu(-5.25, 1), shishagonyu(1.5), shishagonyu(-1.5))
(5.3, -5.3, 2.0, -2.0)
@shiracamus(しらかみゅ)
abs を取らなくてもできる。
def shishagonyu(x, n=0):
return int(x * 10**n + (-0.5 if x < 0 else 0.5)) / 10**n
(shishagonyu(5.15, 1), shishagonyu(-5.15, 1), shishagonyu(0.5), shishagonyu(-0.5))
(5.2, -5.2, 1.0, -1.0)
(shishagonyu(5.25, 1), shishagonyu(-5.25, 1), shishagonyu(1.5), shishagonyu(-1.5))
(5.3, -5.3, 2.0, -2.0)
Julia
shishagonyu(x, n=0) = sign(x)*Int64(abs(x)*10^n + 0.5)/10^n;
(shishagonyu(5.15, 1), shishagonyu(-5.15, 1), shishagonyu(0.5), shishagonyu(-0.5))
(5.2, -5.2, 1.0, -1.0)
(shishagonyu(5.25, 1), shishagonyu(-5.25, 1), shishagonyu(2.5), shishagonyu(-2.5))
(5.3, -5.3, 3.0, -3.0)
@antimon2(Shunsuke GOTOH)
Julia は標準の関数で四捨五入を実現できるものがある。
shishagonyu(x, n=0) = round(x, RoundNearestTiesAway; digits=n);
(shishagonyu(5.15, 1), shishagonyu(-5.15, 1), shishagonyu(0.5), shishagonyu(-0.5))
(5.2, -5.2, 1.0, -1.0)
(shishagonyu(5.25, 1), shishagonyu(-5.25, 1), shishagonyu(2.5), shishagonyu(-2.5))
(5.3, -5.3, 3.0, -3.0)
R
shishagonyu = function(x, n=0) sign(x)*as.integer(abs(x)*10^n + 0.5)/10^n
cat(shishagonyu(5.15, 1), shishagonyu(-5.15, 1), shishagonyu(0.5), shishagonyu(-0.5))
5.2 -5.2 1 -1
cat(shishagonyu(5.25, 1), shishagonyu(-5.25, 1), shishagonyu(2.5), shishagonyu(-2.5))
5.3 -5.3 3 -3
@shiracamus(しらかみゅ) さんの指摘により修正
shishagonyu = function(x, n=0) as.integer(x * 10^n + ifelse(x < 0, -0.5, 0.5)) / 10^n
cat(shishagonyu(5.15, 1), shishagonyu(-5.15, 1), shishagonyu(0.5), shishagonyu(-0.5))
5.2 -5.2 1 -1
cat(shishagonyu(5.25, 1), shishagonyu(-5.25, 1), shishagonyu(2.5), shishagonyu(-2.5))
5.3 -5.3 3 -3