C# - 将十进制转换为int32

时间:2012-05-11 10:47:58

标签: c# .net math rounding

我有以下代码:

int a = Convert.ToInt32(4.5m);
int b = Convert.ToInt32(5.5m);

Console.WriteLine(a);
Console.WriteLine(b);

这是输出:

4
6

为什么Convert.ToInt32将十进制值舍入到最接近的偶数?

6 个答案:

答案 0 :(得分:13)

int a = (int)Math.Floor(4.5m);
int b = (int)Math.Floor(5.5m);

MSDN:

或者:

int a = decimal.ToInt32(4.5m);
int b = decimal.ToInt32(4.5m)

您也可以使用显式int cast运算符:

int a = (int) 4.5m;
int b = (int) 5.5m;

但请从MSDN阅读此说明:

  

此运算符支持将Decimal显式转换为Int32。此类显式转换的语法依赖于语言,并且各个语言编译器可以提供不同的实现并返回不同的结果。该示例说明了使用C#和Visual Basic将Decimal值显式转换为Int32值时的不同返回值。要执行独立于语言的转换,可以调用ToInt32或Convert.ToInt32(Decimal)方法。


Math.Floor Method (Decimal)
  

返回小于或等于指定十进制数的最大整数。

请注意,小数大于int,因此如果该值大于int.MaxValue,则会得到OverflowException

答案 1 :(得分:13)

转换是使用舍入到最近,或银行家的舍入:

  

此方法的行为遵循IEEE标准754第4节   有时候称为四舍五入到最近,或者是银行家   四舍五入。它最大限度地减少了始终如一的舍入误差   在单一方向上舍入中点值。

     

要控制Round方法使用的舍入类型,请调用   Math.Round(Double,MidpointRounding)重载。

答案 2 :(得分:5)

Math.Round()允许您选择

Console.WriteLine(Math.Round(4.5m, 0, MidpointRounding.ToEven));  //4
Console.WriteLine(Math.Round(5.5m, 0, MidpointRounding.ToEven));  //6

Console.WriteLine(Math.Round(4.5m, 0, MidpointRounding.AwayFromZero));  //5
Console.WriteLine(Math.Round(5.5m, 0, MidpointRounding.AwayFromZero));  //6

(而且,正如您所猜测的那样,默认为ToEven

答案 3 :(得分:4)

这是因为that's how it's defined(见下面的原因):

  

返回:value,四舍五入到最接近的32位有符号整数。如果价值是   在两个整数之间,返回偶数;那   是,4.5转换为4,5.5转换为6.

如果您想要不同的结果,则必须使用Math.Floor之类的内容。

Math.Round的文档,它做了同样的事情,说明了原因:

  

此方法的行为遵循IEEE标准754第4节   圆形有时被称为四舍五入到最近的,或者是银行家   四舍五入。它最大限度地减少了始终如一的舍入误差   在单一方向上舍入中点值。

     

要控制Round(Decimal)方法使用的舍入类型,   调用Math.Round(Decimal,MidpointRounding)重载。

答案 4 :(得分:0)

昨天我读到了一些内容,当四舍五入时,它会四舍五入到最接近的偶数,它被称为银行家四舍五入。你必须告诉它你想要如何围绕

编辑:您要求解释为什么它会向最接近的偶数舍入。

说你有10个号码(这是一个极端情况

1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5

总和= 60

如果你把它们全部放在首位

总和= 65因为它们会全部向上

如果你是银行家围绕他们

总和= 60

答案 5 :(得分:0)

来自http://msdn.microsoft.com/en-us/library/93kx4xke

  

返回值

     

键入:System.Int32值,四舍五入到最接近的32位有符号   整数。如果值在两个整数之间,则为偶数   号码被退回;也就是说,4.5转换为4,而5.5是   转换为6。