如何在C#中将小数转换为int?

如何将小数转换为int?

mscorlib中使用Convert.ToInt32

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

请参阅MSDN 。 您也可以使用Decimal.ToInt32 。 再次请参阅MSDN 。 最后,你可以做一个直接投

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

它使用显式的演员操作符。 请参阅MSDN 。

你不能。

那么,当然,你可以 ,但是一个int(System.Int32)是不够大,以容纳每一个可能的十进制值。

这意味着如果你input一个大于int.MaxValue的小数,你将溢出,如果小数小于int.MinValue,它将会下溢。

当你在/溢出时会发生什么? 两件事之一。 如果您的构build未经检查(即,CLR不关心,如果你这样做),你的应用程序将继续在值超过/下溢后,但在整数值不会是你所期望的。 这可能会导致间歇性的错误,可能很难解决。 您将最终将您的应用程序置于未知状态,这可能会导致您的应用程序破坏其工作的任何重要数据。 不好。

如果你的程序集被选中(properties-> build-> advanced->检查算术溢出/下溢或/ checked编译选项),当发生溢出/溢出时,你的代码将会抛出exception。 这可能比不好; 但是程序集的默认值不是检查溢出/下溢。

真正的问题是“你想要做什么?” 不知道你的要求,没有人可以告诉你在这种情况下你该做什么,除了明显的:不要做。

如果你特别不在乎,这里的答案是有效的。 然而,你应该传达你的理解,即可能发生溢出,并没有关系,通过将你的转换代码包装在一个未经检查的

 unchecked { // do your conversions that may underflow/overflow here } 

这样,后面的人理解你不在乎,如果将来有人更改你的构build/检查,你的代码不会意外中断。

如果所有你想要做的是放下数字的小数部分,留下整数部分,你可以使用Math.Truncate。

 decimal actual = 10.5M; decimal expected = 10M; Assert.AreEqual(expected, Math.Truncate(actual)); 
 int i = (int)d; 

会给你下舍入的数字。

如果你想四舍五入到最接近的偶数(即> .5将四舍五入),你可以使用

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

一般来说,你可以在C#中的所有数字types之间进行转换。 如果在演员阵容中没有任何信息会丢失,你可以隐式地做:

 int i = 10; decimal d = i; 

尽pipe如果你愿意,你仍然可以明确地做到这一点:

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

但是,如果您要通过演员阵容丢失信息,则必须明确地做(显示您意识到您可能会丢失信息):

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

在这里你正在失去“.5”。 这可能是好的,但你必须明确表示,并明确表明你知道你可能会丢失信息。

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

这应该工作得很好。

快速舍入的一个巧妙的技巧是在将小数点转换为int之前添加.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

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

是否调用System.Decimal.ToInt32()为你工作?

我更喜欢使用Math.Round , Math.Floor , Math.Ceiling或Math.Truncate来根据需要明确设置舍入模式。

请注意,它们都返回Decimal,因为Decimal的值范围比Int32大,所以您仍然需要投射(并检查上溢/下溢)。

  checked { int i = (int)Math.Floor(d); } 
 decimal vIn = 0.0M; int vOut = Convert.ToInt32(vIn); 

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

十进制d = 5.5 ;

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

ref: 链接文本

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

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

a = 49.9 ,则b = 50

a = 49.5 ,则b = 50

a = 49.4 ,则b = 49

我发现,如果你有一个盒装的十进制(即对象types内的十进制值),铸造操作符不工作。 Convert.ToInt32(十进制作为对象)在这种情况下工作正常。

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

 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取消装箱转换