我有以下代码:
int a = Convert.ToInt32(4.5m);
int b = Convert.ToInt32(5.5m);
Console.WriteLine(a);
Console.WriteLine(b);
这是输出:
4
6
为什么Convert.ToInt32
将十进制值舍入到最接近的偶数?
答案 0 :(得分:13)
int a = (int)Math.Floor(4.5m);
int b = (int)Math.Floor(5.5m);
或者:
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。