読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

round half to even

Lua C++

Luaで偶数丸めをしたくなったのでコードを書いてみました。おまけでC++でも書きました。

「偶数丸め」はいろんな別名があるようです。「最近接偶数への丸め」、「最近接丸め」、「JIS丸め」、「ISO丸め」、「銀行家の丸め 」、「銀行型丸め」、「偶捨奇入」,「五捨五入」など。

参考:

Lua

local function round_half_to_even(n)
  return math.ceil((n - 0.5) / 2) + math.floor((n + 0.5) / 2)
end

local function test(n)
  print(string.format('%g == round_half_to_even(%g)', round_half_to_even(n), n))
end

test(0.)
test(0.5)
test(1.)
test(1.5)
test(2.)
test(2.5)

実行結果:

0 == round_half_to_even(0)
0 == round_half_to_even(0.5)
1 == round_half_to_even(1)
2 == round_half_to_even(1.5)
2 == round_half_to_even(2)
2 == round_half_to_even(2.5)

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

C++

#include<cmath>

template<class T>
T round_half_to_even(T n)
{
    return std::ceil((n - 0.5) / 2) + std::floor((n + 0.5) / 2);
}


#include<iostream>

template<class T>
auto test(T n){
    std::cout << round_half_to_even(n) << " == round_half_to_even(" << n << ")\n";
}

int main(){
    test(0.);
    test(0.5);
    test(1.);
    test(1.5);
    test(2.);
    test(2.5);
}

実行結果:

0 == round_half_to_even(0)
0 == round_half_to_even(0.5)
1 == round_half_to_even(1)
2 == round_half_to_even(1.5)
2 == round_half_to_even(2)
2 == round_half_to_even(2.5)

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ