次のコードがあります。
int a = Convert.ToInt32(4.5m);
int b = Convert.ToInt32(5.5m);
Console.WriteLine(a);
Console.WriteLine(b);
出力は次のとおりです。
4
6
Convert.ToInt32
10 進数値を最も近い偶数に丸めるのはなぜですか?
Convert は、最も近いものへの丸め、またはバンカーの丸めを使用しています。
このメソッドの動作は、IEEE 規格 754 のセクション 4 に従います。中間値を一方向に一貫して丸めることに起因する丸め誤差を最小限に抑えます。
Round メソッドで使用される丸めの種類を制御するには、Math.Round(Double, MidpointRounding) オーバーロードを呼び出します。
int a = (int)Math.Floor(4.5m);
int b = (int)Math.Floor(5.5m);
または:
int a = decimal.ToInt32(4.5m);
int b = decimal.ToInt32(4.5m)
明示的な int キャスト演算子を使用することもできます。
int a = (int) 4.5m;
int b = (int) 5.5m;
ただし、MSDNからこのメモを読んでください。
この演算子は、Decimal から Int32 への明示的な変換をサポートしています。このような明示的な変換の構文は言語に依存し、個々の言語コンパイラはさまざまな実装を提供し、さまざまな結果を返すことができます。この例は、C# と Visual Basic を使用して Decimal 値を Int32 値に明示的に変換した場合のさまざまな戻り値を示しています。言語に依存しない変換を実行するには、ToInt32 または Convert.ToInt32(Decimal) メソッドを呼び出します。
Math.Floor Method (Decimal)
指定された 10 進数以下の最大の整数を返します。
値が取得しint
た値よりも大きい場合、10 進数はそれよりも大きいことに注意してください。int.MaxValue
OverflowException
Math.Round()を使用すると、
Console.WriteLine(Math.Round(4.5m, 0, MidpointRounding.ToEven)); //4
Console.WriteLine(Math.Round(5.5m, 0, MidpointRounding.ToEven)); //6
Console.WriteLine(Math.Round(4.5m, 0, MidpointRounding.AwayFromZero)); //5
Console.WriteLine(Math.Round(5.5m, 0, MidpointRounding.AwayFromZero)); //6
(そして、あなたが推測するように、デフォルトはですToEven
)
これは、そのように定義されているためです(理由については以下を参照してください)。
戻り値: 最も近い 32 ビット符号付き整数に丸められた値。値が 2 つの整数の中間にある場合、偶数が返されます。つまり、4.5 は 4 に変換され、5.5 は 6 に変換されます。
Math.Floor
異なる結果が必要な場合は、次のようなものを使用する必要があります。
Math.Round
同じことを行うのドキュメントには、理由が記載されています。
このメソッドの動作は、IEEE 規格 754 のセクション 4 に従います。中間値を一方向に一貫して丸めることに起因する丸め誤差を最小限に抑えます。
Round(Decimal) メソッドで使用される丸めの種類を制御するには、Math.Round(Decimal, MidpointRounding) オーバーロードを呼び出します。
昨日、丸めが発生すると、最も近い偶数に丸められることを読んだことがあります。これは、バンカーの丸めと呼ばれます。どのように丸めたいかを伝える必要があります
編集:最も近い偶数に丸める理由の説明を求めました。
10 個の数字があるとします (これは極端なケースです)
1.5、2.5、3.5、4.5、5.5、6.5、7.5、8.5、9.5、10.5
合計 = 60
最初にそれらをすべて四捨五入する場合
合計 = 65 は、すべて切り上げになるためです。
バンカーが丸めたら
合計 = 60
http://msdn.microsoft.com/en-us/library/93kx4xkeから
戻り値
型: System.Int32 値。最も近い 32 ビットの符号付き整数に丸められます。値が 2 つの整数の中間にある場合、偶数が返されます。つまり、4.5 は 4 に変換され、5.5 は 6 に変換されます。