我有以下代码:
int a = Convert.ToInt32(4.5m);
int b = Convert.ToInt32(5.5m);
Console.WriteLine(a);
Console.WriteLine(b);
这是输出:
4
6
为什么Convert.ToInt32
将十进制值四舍五入到最接近的偶数?
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 强制转换运算符:
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
Convert 使用四舍五入到最接近的值,或银行家的四舍五入:
此方法的行为遵循 IEEE 标准 754 第 4 节。这种四舍五入有时称为四舍五入或银行家四舍五入。它可以最大限度地减少因在单个方向上持续舍入中点值而导致的舍入误差。
要控制 Round 方法使用的舍入类型,请调用 Math.Round(Double, MidpointRounding) 重载。
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
)
这样做是因为它是这样定义的(原因见下文):
返回: 值,四舍五入到最接近的 32 位有符号整数。如果 value 在两个整数的中间,则返回偶数;即4.5转换为4,5.5转换为6。
Math.Floor
如果你想要不同的结果,你必须使用类似的东西。
做同样事情的文档Math.Round
说明了原因:
此方法的行为遵循 IEEE 标准 754 第 4 节。这种四舍五入有时称为四舍五入或银行家四舍五入。它可以最大限度地减少因在单个方向上持续舍入中点值而导致的舍入误差。
要控制 Round(Decimal) 方法使用的舍入类型,请调用 Math.Round(Decimal, MidpointRounding) 重载。
昨天我读到一些东西,当四舍五入时,它会四舍五入到最接近的偶数,这叫做银行家四舍五入。你必须告诉它你想如何四舍五入
编辑:您要求解释为什么它会四舍五入到最接近的偶数。
假设你有 10 个数字(这是一个极端情况
1.5、2.5、3.5、4.5、5.5、6.5、7.5、8.5、9.5、10.5
总和 = 60
如果你先把它们四舍五入
总和 = 65 因为他们都会四舍五入
如果你们银行家围绕他们
总和 = 60
来自http://msdn.microsoft.com/en-us/library/93kx4xke
返回值
类型:System.Int32 值,四舍五入到最接近的 32 位有符号整数。如果 value 在两个整数的中间,则返回偶数;即4.5转换为4,5.5转换为6。