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

@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

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

C#

.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

広告を非表示にする