如何将小数转换为整数?
13 回答
你不能。
好吧,当然可以,但是 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# 中的所有数字类型之间进行转换。如果在演员阵容中没有信息会丢失,你可以隐式地做到这一点:
int i = 10;
decimal d = i;
尽管如果您愿意,您仍然可以明确地执行此操作:
int i = 10;
decimal d = (decimal)i;
但是,如果你要通过演员表丢失信息,你必须明确地这样做(以表明你知道你可能会丢失信息):
decimal d = 10.5M;
int i = (int)d;
在这里你失去了“.5”。这可能很好,但您必须明确说明并进行明确的演员表以表明您知道您可能会丢失信息。
decimal 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.html
System.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
等等
快速舍入的一个巧妙技巧是在将小数转换为 int 之前添加 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(decimal as object) 在这种情况下可以正常工作。
从数据库中检索 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 取消装箱转换
似乎没有答案可以处理由于尝试转换 int 范围之外的小数而产生的 OverflowException/UnderflowException。
int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));
如果十进制值超出 int 范围,此解决方案将返回可能的最大或最小 int 值。当值在 int 范围内时,您可能希望使用 Math.Round、Math.Ceiling 或 Math.Floor 添加一些舍入。
将十进制转换为整数
decimal decimalValue=5.00;
int intValue=Convert.ToInt32(decimalValue);