如何将小数转换为整型?
使用Convert.ToInt32从mscorlib,如
Convert.ToInt32
mscorlib
decimal value = 3.14m; int n = Convert.ToInt32(value);
看到MSDN。你也可以使用Decimal.ToInt32。同样,参见MSDN。最后,你可以直接转换为
Decimal.ToInt32
decimal value = 3.14m; int n = (int) value;
它使用显式强制转换操作符。看到MSDN。
System.Decimal实现了IConvertable接口,它有一个ToInt32()成员。
System.Decimal
IConvertable
ToInt32()
调用System.Decimal.ToInt32()对你有用吗?
System.Decimal.ToInt32()
decimal d = 2; int i = (int) d;
这应该可以正常工作。
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"丢掉了。这可能很好,但您必须明确它并进行明确的强制转换,以表明您知道您可能会丢失信息。
快速舍入的一个巧妙技巧是在将小数点转换为整型之前加上。5。
decimal d = 10.1m; d += .5m; int i = (int)d;
仍然保留i=10,但是
i=10
decimal d = 10.5m; d += .5m; int i = (int)d;
将四舍五入,以便i=11。
i=11
你不能。
好吧,当然你可以,但是int (System.Int32)不足以容纳所有可能的十进制值。
这意味着如果你强制转换一个比int大的小数。MaxValue会溢出,如果小数点小于int。MinValue,它会溢出。
当你不足/溢出时会发生什么?两件事之一。如果您的构建是未检查的(即,CLR并不关心您是否这样做),您的应用程序将在值溢出/下溢之后继续运行,但int中的值将不是您所期望的值。这可能会导致间歇性的错误,并且可能很难修复。您的应用程序最终将处于未知状态,这可能会导致应用程序破坏它所处理的任何重要数据。不好的。
如果您的程序集被选中(properties->build->advanced->check for算术溢出/下溢或/checked compiler选项),则在发生下溢/溢出时,代码将抛出异常。这可能比没有好;但是,程序集的默认值是不检查溢出/溢出。
真正的问题是“你想做什么?”在不知道你的需求的情况下,没有人能告诉你应该在这种情况下做什么,除了显而易见的:DON'T do IT。
如果你特别不在乎,这里的答案是有效的。但是,您应该沟通您对可能发生溢出的理解,并且将强制转换代码包装在无节制的块中并不重要
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); }
我发现强制转换操作符不工作,如果你有一个盒装小数(即一个对象类型内的十进制值)。转换。ToInt32(作为对象的十进制)在这种情况下工作正常。
当从数据库中检索IDENTITY/ autoumber值时出现这种情况:
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开箱转换
十进制d = 5.5;
d = 5.5
int i = decimal.ToInt32(d);// you will get i = 5
裁判:链接文本
四舍五入小数到最接近的整数
decimal a ; int b = (int)(a + 0.5m);
当a = 49.9时,则b = 50
a = 49.9
b = 50
当a = 49.5时,则b = 50
a = 49.5
当a = 49.4时,则b = 49等。
a = 49.4
b = 49
decimal vIn = 0.0M; int vOut = Convert.ToInt32(vIn);
没有答案似乎处理OverflowException/UnderflowException来自试图转换int范围之外的小数。
int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));
如果十进制值在int范围之外,此解决方案将返回可能的最大或最小int值。你可能想用Math添加一些舍入。圆的,数学。天花板或数学。当值在int范围内时的下限。
将十进制转换为整数
decimal decimalValue=5.00; int intValue=Convert.ToInt32(decimalValue);