如何将小数转换为整型?


当前回答

我更喜欢用数学。圆的,数学。地板上,数学。天花板或数学。截断以显式地设置适当的舍入模式。

注意,它们也都返回Decimal——因为Decimal的值范围比Int32大,所以您仍然需要强制转换(并检查溢出/下溢)。

 checked {
   int i = (int)Math.Floor(d);
 }

其他回答

decimal d = 2;
int i = (int) d;

这应该可以正常工作。

快速舍入的一个巧妙技巧是在将小数点转换为整型之前加上。5。

decimal d = 10.1m;
d += .5m;
int i = (int)d;

仍然保留i=10,但是

decimal d = 10.5m;
d += .5m;
int i = (int)d;

四舍五入,使i=11。

我更喜欢用数学。圆的,数学。地板上,数学。天花板或数学。截断以显式地设置适当的舍入模式。

注意,它们也都返回Decimal——因为Decimal的值范围比Int32大,所以您仍然需要强制转换(并检查溢出/下溢)。

 checked {
   int i = (int)Math.Floor(d);
 }

四舍五入小数到最接近的整数

decimal a ;
int b = (int)(a + 0.5m);

当a = 49.9时,b = 50

当a = 49.5时,b = 50

当a = 49.4时,b = 49,以此类推。

我发现强制转换操作符不工作,如果你有一个盒装小数(即一个对象类型内的十进制值)。转换。ToInt32(作为对象的十进制)在这种情况下工作正常。

当从数据库中检索IDENTITY/ autoumber值时出现这种情况:

SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar());  // works
int ID = (int)foo.ExecuteScalar();              // throws InvalidCastException

参见4.3.2开箱转换