回答:
使用する Math.round()
と組み合わせてするMidpointRounding.AwayFromZero
例えば:
Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3
double d = 1.234;
int i = Convert.ToInt32(d);
次のように丸めを処理します。
最も近い32ビット符号付き整数に丸められます。値が2つの整数の中間にある場合は、偶数が返されます。つまり、4.5は4に変換され、5.5は6に変換されます。
Math.Round
必要に応じてintを返すため、はるかに優れています。
[0,.5)
すると、数値のちょうど半分が丸め[.5,1)
られます。それは丸めて少しでも、偶数にバイアスをかけるために丸め(.5,1.5)
1ではなく[1.5,2.5]
2に
関数を使用することもできます:
//Works with negative numbers now
static int MyRound(double d) {
if (d < 0) {
return (int)(d - 0.5);
}
return (int)(d + 0.5);
}
アーキテクチャによっては数倍高速です。
double d;
int rounded = (int)Math.Round(d);
私はこの質問が古いことを知っていますが、同じような質問への答えを探すためにそれを見つけました。与えられた非常に役立つヒントを共有したいと思いました。
intに変換する場合は、.5
ダウンキャストする前に値を追加するだけです。ダウンキャスティングはint
常に低い数値(例:)に低下するため、(int)1.7 == 1
数値が.5
大きいか大きい場合、追加.5
すると次の数値になり、ダウンキャストint
によって正しい値が返されます。(例(int)(1.8 + .5) == 2
)
+ 0.5 * Math.Abs(d)
他の回答のメソッドはOverflowException
、float値がIntの範囲外の場合にスローされます。https://docs.microsoft.com/en-us/dotnet/api/system.convert.toint32?view=netframework-4.8#System_Convert_ToInt32_System_Single_
int result = 0;
try {
result = Convert.ToInt32(value);
}
catch (OverflowException) {
if (value > 0) result = int.MaxValue;
else result = int.Minvalue;
}
Unityの場合は、Mathf.RoundToIntを使用します。
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
void Start()
{
// Prints 10
Debug.Log(Mathf.RoundToInt(10.0f));
// Prints 10
Debug.Log(Mathf.RoundToInt(10.2f));
// Prints 11
Debug.Log(Mathf.RoundToInt(10.7f));
// Prints 10
Debug.Log(Mathf.RoundToInt(10.5f));
// Prints 12
Debug.Log(Mathf.RoundToInt(11.5f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.0f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.2f));
// Prints -11
Debug.Log(Mathf.RoundToInt(-10.7f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.5f));
// Prints -12
Debug.Log(Mathf.RoundToInt(-11.5f));
}
}
public static int RoundToInt(float f) { return (int)Math.Round(f); }
Intボタンを備えた関数電卓を開発しています。私は以下がシンプルで信頼できる解決策であることがわかりました:
double dblInteger;
if( dblNumber < 0 )
dblInteger = Math.Ceiling(dblNumber);
else
dblInteger = Math.Floor(dblNumber);
Math.Roundは予期しない結果または望ましくない結果を生成することがあり、(キャストまたはConvert.ToInt ...を介した)整数への明示的な変換は、高精度の数値に対して誤った値を生成することがよくあります。上記の方法は常に機能するようです。
Convert.ToInt32()
同じことをしませんか、それとも小数点以下をすべて取り除きますか?