如何将小数转换为整型?


当前回答

将十进制转换为整数

decimal decimalValue=5.00;
int intValue=Convert.ToInt32(decimalValue);

其他回答

你不能。

当然可以,但是int (System.Int32)不足以容纳所有可能的十进制值。

这意味着如果你强制转换一个比int大的小数。MaxValue会溢出,如果小数点小于int。MinValue,它会溢出。

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

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

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

如果你特别不在乎,这里的答案是有效的。但是,您应该传达您的理解,即可能发生溢出,并且将强制转换代码包装在未检查的块中无关紧要

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));

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

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

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

十进制d = 5.5;

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

参考:链接文本

没有答案似乎处理OverflowException/UnderflowException来自试图转换int范围之外的小数。

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

如果十进制值在int范围之外,此解决方案将返回可能的最大或最小int值。你可能想用Math添加一些舍入。圆的,数学。天花板或数学。当值在int范围内时的下限。

使用转换。从mscorlib中的ToInt32

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

看到MSDN。你也可以使用Decimal.ToInt32。同样,请参见MSDN。最后,你可以直接转换为

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

它使用显式强制转换操作符。看到MSDN。