我该如何将十进制转换为整数?
null
vs. 0
vs. ""
)。建议您不要使用 Convert 方法,除非您绝对需要它的灵活性(例如在动态类型的场景下)。 - Eamon NerbonneOverflowException
。我认为 @Will 在这里提供了更好的答案 https://dev59.com/C3RB5IYBdhLWcg3wz6ed#501165。 - mezoidConvert.ToInt32
和Decimal.ToInt32
的行为不同。根据MSDN文档:Decimal.ToInt32
的返回值是十进制数值的整数部分;小数位被截断。Convert.ToInt32
的返回值将舍入到最接近的32位有符号整数。如果值处于两个整数之间,则返回偶数;例如4.5被转换为4,而5.5被转换为6。 - vezucci不行。
当然,你可以,但是 int (System.Int32) 不足以容纳每个可能的十进制值。
这意味着,如果你转换一个大于 int.MaxValue 的十进制数,你将会溢出,如果小于 int.MinValue,则会下溢。
当你下/上溢时会发生什么?有两种情况。如果你的构建未经检查(即 CLR 不关心你是否这样做),则在值溢出/下溢后,你的应用程序将继续运行,但 int 中的值将不是你期望的值。这可能导致间歇性错误,并且可能很难修复。你的应用程序最终处于未知状态,可能导致应用程序破坏其正在处理的任何重要数据。这不好。
如果你的程序集已经检查过了(属性->生成->高级->检查算术溢出/下溢或 /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#中,你可以在所有数字类型之间进行强制类型转换。如果在转换过程中不会丢失信息,那么你可以隐式地进行类型转换:
You can cast between all numerical types in C#, implicitly if there is no loss of information during the conversion.
int i = 10;
decimal d = i;
如果你愿意,尽管你仍然可以显式地这样做:
int i = 10;
decimal d = (decimal)i;
然而,如果您要通过转换丢失信息,则必须明确指定(以显示您已经意识到可能会丢失信息):
decimal d = 10.5M;
int i = (int)d;
在这里,你正在损失 ".5"。 这可能没问题,但你必须明确表达并进行显式转换以显示你知道可能会丢失信息。
ToEven
应该可以防止统计漂移。但是如果你处理的是可收费物品或金钱,AwayFromZero
似乎是正确的选择。 - mbxdecimal d = 2;
int i = (int) d;
这应该完全没问题。
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);
这是一个非常方便的数据类型转换网页,供其他人使用。
http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.htmlSystem.Decimal
实现了 IConvertable
接口,该接口具有一个 ToInt32()
成员。
您能否调用 System.Decimal.ToInt32()
?
decimal a ;
int b = (int)(a + 0.5m);
当 a = 49.9
时,b = 50
。
当 a = 49.5
时,b = 50
。
当 a = 49.4
时,b = 49
等等。
decimal d = 10.1m;
d += .5m;
int i = (int)d;
仍然有i=10
,但是
decimal d = 10.5m;
d += .5m;
int i = (int)d;
将会四舍五入,使得i=11
。
checked {
int i = (int)Math.Floor(d);
}