端数処理
decimal value = 2.5;
double value2 = -2.5;
//切り上げ
value = Math.Ceilng(value);
//切り下げ
//Floor: -3、Truncate: -2
value = Math.Floor(value2);
value = Math.Truncate(value2);
//四捨五入
//MidpointRounding.AwayFromZeroを指定しないと結果は2となる
value = Math.Round(value, MidpointRounding.AwayFromZero);
通常のMath.Roundを使うと「銀行家の丸め」といって、
厳密な四捨五入ではなく、結果が偶数になるような丸め方がされます。
(〜.5を全て切り上げする計算を、何度も足し続けると
大きな値側に誤差がよるからです。)
ビジネスロジックで金額の計算時などに、
「四捨五入をする」とされている場合には
異なる演算結果が出るので注意が必要です。
また、切り下げのMath.FloorとMath.Truncateでは、
正の値では同じ結果となりますが、
負の値では、
Floorは-無限大側、Truncateは0側に寄せて丸められます。