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

时间:2009-02-01 16:29:29

标签: c# .net int decimal

如何将小数转换为int?

12 个答案:

答案 0 :(得分:251)

使用Convert.ToInt32中的mscorlib,如

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

MSDN。您也可以使用Decimal.ToInt32。再次,请参阅MSDN。最后,你可以像

那样进行直接演员表演
decimal value = 3.14m;
int n = (int) value;

使用显式强制转换运算符。请参阅MSDN

答案 1 :(得分:67)

你不能。

嗯,当然你可以,但int(System.Int32)不足以容纳每个可能的十进制值。

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

当您在/溢出时会发生什么?两件事之一。如果您的构建未被选中(即,CLR并不关心您是否这样做),您的应用程序将在值上/下溢之后继续,但int中的值将不是您所期望的。这可能导致间歇性的错误,可能很难修复。您将以未知状态结束应用程序,这可能导致您的应用程序破坏其正在处理的任何重要数据。不好。

如果选中了程序集(properties-> build-> advanced->检查算术溢出/下溢或/ checked编译器选项),则当发生欠/溢时时,代码将抛出异常。这可能比没有好;但是程序集的默认值不是检查上溢/下溢。

真正的问题是“你想做什么?”在没有了解您的要求的情况下,没有人可以告诉您在这种情况下应该做什么,除了显而易见的事情:不要做。

如果你特别不在乎,这里的答案是有效的。但是,您应传达您对溢出可能发生的理解,并且通过将您的演员代码包装在未经检查的

中无关紧要
unchecked
{
  // do your conversions that may underflow/overflow here
}

那样,那些落后于你的人理解你并不在意,如果将来有人将你的构建更改为/ checked,你的代码将不会意外中断。

如果你要做的就是删除数字的小数部分,留下整数部分,你可以使用Math.Truncate。

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

答案 2 :(得分:43)

int i = (int)d;

会给你四舍五入的数字。

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

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

通常,您可以在C#中的所有数值类型之间进行转换。如果在演员阵容期间没有丢失的信息,你可以隐含地这样做:

int i = 10;
decimal d = i;

虽然如果您愿意,仍然可以明确地执行此操作:

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

但是,如果你要通过演员表丢失信息,你必须明确地做(显示你知道你可能会丢失信息):

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

这里你正在失去“.5”。这可能没问题,但你必须明确它,并做一个明确的演员表明你可能会丢失信息。

答案 3 :(得分:20)

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

这应该可以正常工作。

答案 4 :(得分:10)

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

这是一个非常方便的转换数据类型网页,供其他人使用。 http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html

答案 5 :(得分:8)

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

调用System.Decimal.ToInt32()是否适合您?

答案 6 :(得分:7)

快速舍入的一个巧妙方法是在将十进制转换为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

答案 7 :(得分:6)

我更喜欢使用Math.RoundMath.FloorMath.CeilingMath.Truncate来明确设置舍入模式。

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

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

答案 8 :(得分:6)

十进制d = 5.5;

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

参考:link text

答案 9 :(得分:4)

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

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

a = 49.9时,b = 50

a = 49.5时,b = 50

a = 49.4,然后是b = 49等。

答案 10 :(得分:0)

如果你有一个盒装小数(即对象类型中的十进制值),我发现转换操作符不起作用。 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 Unboxing conversions

答案 11 :(得分:0)

似乎没有答案可以解决OverflowException / UnderflowException,该异常来自尝试转换int范围之外的小数。

int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));

如果十进制值超出int范围,则此解决方案将返回可能的最大或最小int值。当值在int范围内时,您可能需要使用Math.Round,Math.Ceiling或Math.Floor添加一些舍入。