如何在C#中将小数转换为int?

213 .net c# int decimal

如何将小数转换为int?

jas*_*son 259

使用Convert.ToInt32mscorlib作为

decimal value = 3.14m;
int n = Convert.ToInt32(value);
Run Code Online (Sandbox Code Playgroud)

请参阅MSDN.你也可以使用Decimal.ToInt32.再次,请参阅MSDN.最后,你可以做直接演员

decimal value = 3.14m;
int n = (int) value;
Run Code Online (Sandbox Code Playgroud)

它使用显式强制转换运算符.请参阅MSDN.

  • 注意:转换对某些转换有一些令人惊讶的行为(`null` vs.`0` vs.`""`).我建议永远不要使用转换,除非你绝对需要它的灵活性(即在动态类型的场景中) (10认同)
  • 要小心,因为`Convert.ToInt32`和`Decimal.ToInt32`表现不同.从MSDN:`Decimal.ToInt32` - 返回值是十进制值的整数部分; 小数位是**截断**.`Convert.ToInt32` - 返回值**舍入**到最近的32位有符号整数.如果值在两个整数之间,则返回偶数; 也就是说,4.5转换为4,5.5转换为6. (8认同)

小智 67

你不能.

好吧,当然你可以,但是int(System.Int32)不足以容纳每个可能的十进制值.

这意味着如果你输出一个大于int.MaxValue的小数,你将溢出,如果小数小于int.MinValue,它将下溢.

当您在/溢出时会发生什么?两件事之一.如果您的构建未被选中(即,CLR并不关心您是否这样做),您的应用程序将在值上/下溢后继续,但int中的值将不是您所期望的.这可能导致间歇性的错误,可能很难修复.您将以未知状态结束应用程序,这可能导致您的应用程序破坏其正在处理的任何重要数据.不好.

如果检查了程序集(properties-> build-> advanced->检查算术溢出/下溢或/ checked编译器选项),则当发生欠/溢时时,代码将抛出异常.这可能比没有好; 但是程序集的默认设置不是检查上溢/下溢.

真正的问题是"你想做什么?" 在不知情的情况下,没有人可以告诉你在这种情况下应该做些什么,除了显而易见的事情:不要做.

如果你特别不关心,这里的答案是有效的.但是,您应该传达您的理解,即可能会发生溢出,并且将您的强制转换代码包装在未经检查的块中无关紧要

unchecked
{
  // do your conversions that may underflow/overflow here
}
Run Code Online (Sandbox Code Playgroud)

这样,落后于你的人就会明白你并不在乎,如果将来有人将你的构建更改为/ checked,你的代码将不会意外中断.

如果你要做的就是删除数字的小数部分,留下整数部分,你可以使用Math.Truncate.

decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
Run Code Online (Sandbox Code Playgroud)

  • 未经检查的上下文不适用于小数; 对小数的操作无论如何都会抛出OverflowExceptions. (7认同)
  • 虽然我怀疑如果输入是十进制的,它们在引擎盖下是相同的东西,我觉得使用Decimal.Truncate比Math.Truncate更舒服,因为后者也接受双精度因此可以被理解为能够截断偶数这不是基数10,而是与Decimal.Truncate相反,它是基数10的真正截断. (3认同)

ICR*_*ICR 43

int i = (int)d;
Run Code Online (Sandbox Code Playgroud)

会给你四舍五入的数字.

如果你想要舍入到最近的偶数(即> .5将向上舍入),你可以使用

int i = (int)Math.Round(d, MidpointRounding.ToEven);
Run Code Online (Sandbox Code Playgroud)

通常,您可以在C#中的所有数值类型之间进行转换.如果在演员表中没有丢失的信息,你可以隐含地这样做:

int i = 10;
decimal d = i;
Run Code Online (Sandbox Code Playgroud)

虽然如果你愿意,你仍然可以明确地做到:

int i = 10;
decimal d = (decimal)i;
Run Code Online (Sandbox Code Playgroud)

但是,如果你要通过演员表丢失信息,你必须明确地做(显示你知道你可能会丢失信息):

decimal d = 10.5M;
int i = (int)d;
Run Code Online (Sandbox Code Playgroud)

在这里你失去了".5".这可能没问题,但你必须明确它,并做一个明确的演员表明你可能会丢失信息.


lui*_*bal 21

decimal d = 2;
int i = (int) d;
Run Code Online (Sandbox Code Playgroud)

这应该工作得很好.

  • 当从十进制转换为int时,信息几乎总会丢失,但我相信这有点重要. (19认同)

Dar*_*ren 13

decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);
Run Code Online (Sandbox Code Playgroud)

这是一个非常方便的转换数据类型网页,供其他人使用. http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html


And*_*ndy 8

System.Decimal实现IConvertable具有ToInt32()成员的接口.

打电话System.Decimal.ToInt32()给你工作吗?

  • 来自 [文档](https://msdn.microsoft.com/en-us/library/bb350799(v=vs.110).aspx) :“此 API 支持 .NET Framework 基础结构,不打算使用直接从您的代码”。为什么不使用 Convert.ToInt32? (2认同)

小智 7

快速舍入的一个巧妙方法是在将十进制转换为int之前添加.5.

decimal d = 10.1m;
d += .5m;
int i = (int)d;
Run Code Online (Sandbox Code Playgroud)

仍然离开i=10,但是

decimal d = 10.5m;
d += .5m;
int i = (int)d;
Run Code Online (Sandbox Code Playgroud)

会这样四舍五入i=11.

  • 当有Math.Floor和Math.Ceiling时,为什么还要这么做呢? (5认同)

Mar*_*ett 6

我更喜欢使用Math.Round,Math.Floor,Math.CeilingMath.Truncate来适当地显式设置舍入模式.

请注意,它们都返回Decimal - 因为Decimal具有比Int32更大的值范围,因此您仍然需要强制转换(并检查上溢/下溢).

 checked {
   int i = (int)Math.Floor(d);
 }
Run Code Online (Sandbox Code Playgroud)


小智 6

小数d = 5.5;

int i = decimal.ToInt32(d);// you will get i = 5
Run Code Online (Sandbox Code Playgroud)

ref:链接文字


sle*_*rfx 5

将小数点四舍五入到最接近的整数

decimal a ;
int b = (int)(a + 0.5m);
Run Code Online (Sandbox Code Playgroud)

a = 49.9,则b = 50

a = 49.5,则b = 50

a = 49.4,则b = 49