Math.Roundメソッドのいくつかの説明


C#でMathを使用する.Round(1.25,1),1.3が期待されたが,結果は1.2であった.
1.なぜならRound法は、四捨五入の原則に従うものではなく、「四捨六入五成双」という方式を採用しているが、切り込むビットの後ろに「5未満」または「5より大きい」が必要であれば、通常の意味での四捨五入処理である.「丸められたビットの後」が5に等しい場合は、丸められた末尾が偶数か奇数かを見てみましょう.例:
Math.Round(1.25,1)=1.2 5の前は2で偶数なので5を切り捨てて位置を上げない
Math.Round(1.35,1)=1.4 5の前が3で奇数なのでキャリー
0も偶数に見えるのでMath.Round(0.5, 0) = 0
2.統計学の角度から、「四捨六入五成双」は「四捨五入」より科学的で、それは捨てた後の結果を大きくしたり、小さくしたり、平均したりする.四捨五入のように五に会うと入るのではなく、結果が大数に偏る.
例えば:1.15+1.25+1.35+1.45=5.2、四捨五入で一桁の小数を計算すると
1.2+1.3+1.4+1.5=5.4
「四捨六入五成双」で計算すると、1.2+1.2+1.4+1.4=5.2となり、捨入後の結果は実際の結果をより反映します.
3.C#とVB.Netは、すべて「四捨六入五成双」の原則であり、Sql Serverは簡単な「四捨五入」である.
しかし、1つの数を単独で四捨五入すると、Math.Round(0.5,0)=0なので、別の方法で実現する必要があります.以下は私たちのプロジェクトで使用する方法です.参考にしてください.
public static decimal Round(decimal d, int decimals)
{
 decimal tenPow = Convert.ToDecimal(Math.Pow(10, decimals));
 decimal scrD = d * tenPow + 0.5m;
 return (Convert.ToDecimal(Math.Floor(Convert.ToDouble(scrD))) / tenPow);
}

また、小数位が十分長い場合にはDecimalも可能である.Roundという方法は、例えば:
Decimal.Round(1.25, 1) = 1.2
でもDecimalならRound(1.251, 1) = 1.3
そこで以下の方法でも四捨五入の効果が得られます
public static decimal MyDecimalRound(decimal d, int decimals)
{
 d = d + 0.000000000000001m;
 return Decimal.Round(d, decimals);
}