关于.net:如何在C#中将小数转换为int?

How do I convert a decimal to an int in C#?

如何将十进制转换为int?


使用mscorlib中的Convert.ToInt32,如

1
2
decimal value = 3.14m;
int n = Convert.ToInt32(value);

参见MSDN。您也可以使用Decimal.ToInt32。再次,请参阅msdn。最后,您可以像中一样执行直接演员表

1
2
decimal value = 3.14m;
int n = (int) value;

它使用显式强制转换运算符。参见MSDN。


你不能。

当然可以,但是int(system.int32)不够大,不能容纳所有可能的十进制值。

这意味着,如果您对一个大于int.maxvalue的小数进行强制转换,则会溢出;如果该小数小于int.minvalue,则会下溢。

当你低于/溢出时会发生什么?两件事之一。如果未选中生成(即,clr不关心是否选中),则应用程序将在值溢出/下溢后继续,但in t中的值将不是您期望的值。这可能会导致间歇性的错误,并且很难修复。您的应用程序将以未知状态结束,这可能导致应用程序损坏其工作的任何重要数据。不好的。

如果选中了程序集(properties->build->advanced->check for算术溢出/下溢或/checked compiler选项),则当发生欠/溢出时,代码将引发异常。这可能比不好;但是,程序集的默认设置是不检查溢出/下溢。

真正的问题是"你想做什么?"在不知道你的要求的情况下,没有人能告诉你在这种情况下应该做什么,除了显而易见的:不要这样做。

如果您不在乎,这里的答案是有效的。但是,您应该传达您的理解,即溢出可能发生,而将转换代码包装在未选中的块中并不重要。

1
2
3
4
unchecked
{
  // do your conversions that may underflow/overflow here
}

这样,后面的人就知道你不在乎,如果将来有人将你的构建更改为/检查,你的代码就不会意外中断。

如果您只想删除数字的小数部分,保留整数部分,则可以使用math.truncate。

1
2
3
decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));


1
int i = (int)d;

会给你四舍五入的数字。

如果要四舍五入到最接近的偶数(即大于5将四舍五入),可以使用

1
int i = (int)Math.Round(d, MidpointRounding.ToEven);

通常,您可以在C中的所有数值类型之间进行转换。如果在强制转换期间没有将丢失的信息,则可以隐式执行此操作:

1
2
int i = 10;
decimal d = i;

但如果您愿意,您仍然可以明确地这样做:

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

但是,如果要通过强制转换丢失信息,则必须显式执行(以表明您意识到可能丢失信息):

1
2
decimal d = 10.5M;
int i = (int)d;

这是你的"5"。这可能很好,但您必须明确地说明这一点,并进行明确的强制转换,以表明您可能正在丢失信息。


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

这应该很管用。


1
2
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);

这是一个非常方便的转换数据类型的网页为其他人。http://www.convertdatatypes.com/convert-decimal-to-int-in-csharp.html


System.Decimal实现IConvertable接口,该接口具有ToInt32()成员。

打电话给System.Decimal.ToInt32()对你有用吗?


快速四舍五入的一个巧妙技巧是在将小数转换为int之前加上.5。

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

仍然离开i=10,但是

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

会被围拢,以便i=11


十进制数d = 5.5

1
int i = decimal.ToInt32(d);// you will get i = 5

链接文本


我更喜欢使用math.round、math.floor、math.heiling或math.truncate来明确设置适当的舍入模式。

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

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

将小数四舍五入为最接近的整数

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

a = 49.9时,则为b = 50

a = 49.5时,则为b = 50

a = 49.4时,则b = 49等。


我发现,如果有装箱的十进制(即对象类型中的十进制值),则强制转换运算符不起作用。在这种情况下,convert.toint32(十进制对象)可以正常工作。

从数据库中检索标识/自动编号值时会出现这种情况:

1
2
3
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拆箱转换