@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Round関数の四捨五入とJIS丸め

.NET FrameworkではRound関数は四捨五入ではなく、JIS丸め*1という方式をとっています。次のように四捨五入とは違う結果が返ってきます。

using System;
using System.Data;
using NUnit.Framework;
using NUnit.Framework.SyntaxHelpers;

[TestFixture]
public class RoundSample
{
    [Test]
    public void 四捨五入()
    {
        Assert.That(Math.Round(0.5), Is.EqualTo(0.0)); //JIS丸め
        Assert.That(Math.Round(1.5), Is.EqualTo(2.0));
        Assert.That(Math.Round(0.5, MidpointRounding.ToEven), Is.EqualTo(0.0)); //JIS丸め
        Assert.That(Math.Round(1.5, MidpointRounding.ToEven), Is.EqualTo(2.0));
        Assert.That(Math.Round(0.5, MidpointRounding.AwayFromZero), Is.EqualTo(1.0));
        Assert.That(Math.Round(1.5, MidpointRounding.AwayFromZero), Is.EqualTo(2.0));

        Assert.That(Decimal.Round(0.5m), Is.EqualTo(0.0)); //JIS丸め
        Assert.That(Decimal.Round(1.5m), Is.EqualTo(2.0));
        Assert.That(Decimal.Round(0.5m, MidpointRounding.ToEven), Is.EqualTo(0.0)); //JIS丸め
        Assert.That(Decimal.Round(1.5m, MidpointRounding.ToEven), Is.EqualTo(2.0));
        Assert.That(Decimal.Round(0.5m, MidpointRounding.AwayFromZero), Is.EqualTo(1.0));
        Assert.That(Decimal.Round(1.5m, MidpointRounding.AwayFromZero), Is.EqualTo(2.0));
    }
}

四捨五入をしたい場合はMidpointRounding.AwayFromZeroを指定してください。

*1:http://homepage1.nifty.com/s_miyake/hp/jisround.htm:title