如何在C#中将小数转换为int?
如何将小数转换为int?
在mscorlib
中使用Convert.ToInt32
decimal value = 3.14m; int n = Convert.ToInt32(value);
请参阅MSDN 。 您也可以使用Decimal.ToInt32
。 再次请参阅MSDN 。 最后,你可以做一个直接投
decimal value = 3.14m; int n = (int) value;
它使用显式的演员操作符。 请参阅MSDN 。
你不能。
那么,当然,你可以 ,但是一个int(System.Int32)是不够大,以容纳每一个可能的十进制值。
这意味着如果你input一个大于int.MaxValue的小数,你将溢出,如果小数小于int.MinValue,它将会下溢。
当你在/溢出时会发生什么? 两件事之一。 如果您的构build未经检查(即,CLR不关心,如果你这样做),你的应用程序将继续在值超过/下溢后,但在整数值不会是你所期望的。 这可能会导致间歇性的错误,可能很难解决。 您将最终将您的应用程序置于未知状态,这可能会导致您的应用程序破坏其工作的任何重要数据。 不好。
如果你的程序集被选中(properties-> build-> advanced->检查算术溢出/下溢或/ checked编译选项),当发生溢出/溢出时,你的代码将会抛出exception。 这可能比不好; 但是程序集的默认值不是检查溢出/下溢。
真正的问题是“你想要做什么?” 不知道你的要求,没有人可以告诉你在这种情况下你应该做什么,除了明显的:不要做。
如果你特别不在乎,这里的答案是有效的。 然而,你应该传达你的理解,即可能发生溢出,并没有关系,通过将你的转换代码包装在一个未经检查的块
unchecked { // do your conversions that may underflow/overflow here }
这样,后面的人理解你不在乎,如果将来有人更改你的构build/检查,你的代码不会意外中断。
如果所有你想要做的是放下数字的小数部分,留下整数部分,你可以使用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#中的所有数字types之间进行转换。 如果在演员阵容中没有任何信息会丢失,你可以隐式地做:
int i = 10; decimal d = i;
尽pipe如果你愿意,你仍然可以明确地做到这一点:
int i = 10; decimal d = (decimal)i;
但是,如果您要通过演员阵容丢失信息,则必须明确地做(显示您意识到您可能会丢失信息):
decimal d = 10.5M; int i = (int)d;
在这里你正在失去“.5”。 这可能是好的,但你必须明确表示,并明确表明你知道你可能会丢失信息。
decimal d = 2; int i = (int) d;
这应该工作得很好。
快速舍入的一个巧妙的技巧是在将小数点转换为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
。
System.Decimal
实现具有ToInt32()
成员的IConvertable
接口。
是否调用System.Decimal.ToInt32()
为你工作?
我更喜欢使用Math.Round , Math.Floor , Math.Ceiling或Math.Truncate来根据需要明确设置舍入模式。
请注意,它们都返回Decimal,因为Decimal的值范围比Int32大,所以您仍然需要投射(并检查上溢/下溢)。
checked { int i = (int)Math.Floor(d); }
decimal vIn = 0.0M; int vOut = Convert.ToInt32(vIn);
这是一个非常方便的转换数据types的网页为他人。 http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html
十进制d = 5.5
;
int i = decimal.ToInt32(d);// you will get i = 5
ref: 链接文本
将小数四舍五入到最接近的整数
decimal a ; int b = (int)(a + 0.5m);
当a = 49.9
,则b = 50
当a = 49.5
,则b = 50
当a = 49.4
,则b = 49
等
我发现,如果你有一个盒装的十进制(即对象types内的十进制值),铸造操作符不工作。 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取消装箱转换