如何将小数转换为int?
答案 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.Round,Math.Floor,Math.Ceiling或Math.Truncate来明确设置舍入模式。
请注意,它们都返回Decimal - 因为Decimal的值范围比Int32大,所以你仍然需要强制转换(并检查溢出/下溢)。
checked {
int i = (int)Math.Floor(d);
}
答案 8 :(得分:6)
答案 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
答案 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添加一些舍入。