C# - 将十进制转换为int32

šlj*_*ker 12 .net c# math rounding

我有以下代码:

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

Console.WriteLine(a);
Console.WriteLine(b);
Run Code Online (Sandbox Code Playgroud)

这是输出:

4
6
Run Code Online (Sandbox Code Playgroud)

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

gdo*_*ica 13

int a = (int)Math.Floor(4.5m);
int b = (int)Math.Floor(5.5m);
Run Code Online (Sandbox Code Playgroud)

MSDN:

要么:

int a = decimal.ToInt32(4.5m);
int b = decimal.ToInt32(4.5m)
Run Code Online (Sandbox Code Playgroud)

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

int a = (int) 4.5m;
int b = (int) 5.5m;
Run Code Online (Sandbox Code Playgroud)

但是从MSDN上阅读这篇文章:

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


Math.Floor Method (Decimal)
Run Code Online (Sandbox Code Playgroud)

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

请注意,int如果该值大于int.MaxValue您获得的值,则小数值大于OverflowException


ie.*_*ie. 13

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

此方法的行为遵循IEEE标准754第4节.这种舍入有时称为舍入到最近,或者是银行家的舍入.它最大限度地减少了在单个方向上始终舍入中点值所导致的舍入误差.

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


Dir*_*irk 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
Run Code Online (Sandbox Code Playgroud)

(而且,正如你猜的那样,默认是ToEven)