Answers:
使用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。
null
对0
vs ""
),转换具有某些令人惊讶的行为。我建议不要使用Convert,除非您绝对需要它的灵活性(例如,在动态键入的情况下)
OverflowException
。我相信@Will在这里可以提供更好的答案stackoverflow.com/a/501165/39532
Convert.ToInt32
和Decimal.ToInt32
行为会有所不同。从MSDN:Decimal.ToInt32
-返回值是十进制值的整数部分;小数位数被截断。Convert.ToInt32
-返回值舍入到最接近的32位有符号整数。如果值位于两个整数之间,则返回偶数;否则,返回偶数。即,4.5转换为4,和5.5被转换为6
你不能
好吧,当然可以,但是int(System.Int32)不足以容纳每个可能的十进制值。
这意味着,如果您强制转换大于int.MaxValue的小数,则将溢出,而如果小数小于int.MinValue,则将下溢。
当您下溢/上溢时会发生什么?两件事之一。如果您的构建未经检查(即CLR不在乎),则在值上溢/下溢后,您的应用程序将继续运行,但是int中的值将不是您所期望的。这可能会导致间歇性错误,并且可能难以修复。您最终会将应用程序置于未知状态,这可能导致您的应用程序破坏其正在处理的所有重要数据。不好。
如果检查了程序集(属性-> build->高级->检查算术上溢/下溢或/ 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));
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”。这样做可能很好,但是您必须对此明确,并进行明确的强制转换以表明您知道自己可能会丢失信息。
ToEven
则应防止统计偏差。但是,如果您使用可收费的物品或金钱来操作,AwayFromZero
似乎是正确的选择。
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);
这是其他人的非常方便的转换数据类型网页。 http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html
快速舍入的一个好窍门是在将小数转换为整数之前加0.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
。
我更喜欢使用Math.Round,Math.Floor,Math.Ceiling或Math.Truncate来适当地显式设置舍入模式。
请注意,它们也都返回Decimal-因为Decimal的值范围比Int32大,所以您仍然需要进行强制转换(并检查是否存在上溢/下溢)。
checked {
int i = (int)Math.Floor(d);
}
我发现,如果您使用装箱的十进制(即对象类型内的十进制值),则强制转换运算符不起作用。在这种情况下,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取消装箱转换
SELECT SCOPE_IDENTITY()
返回numeric(38, 0)
翻译成decimal
.NET的内容。foo.ExecuteScalar()
返回一个decimal
盒装作为object
其不能直接浇铸到int
。(int)(decimal)foo.ExecuteScalar()
或Convert.ToInt32(foo.ExecuteScalar())
会工作。