C#错误从double转换为int32

o3o*_*o3o 3 c#

using NUF = NUnit.Framework;
[NUF.Test]public void DifferentCastingTest() {
     NUF.Assert.That((int)0.499999D, NUF.Is.EqualTo(0)); 
     NUF.Assert.That((int)0.500000D, NUF.Is.EqualTo(0)); // !!! row 1
     NUF.Assert.That((int)1.499999D, NUF.Is.EqualTo(1)); 
     NUF.Assert.That((int)1.500000D, NUF.Is.EqualTo(1)); // !!! row 2

     NUF.Assert.That(System.Convert.ToInt32(0.499999D), NUF.Is.EqualTo(0)); 
     NUF.Assert.That(System.Convert.ToInt32(0.500000D), NUF.Is.EqualTo(0)); // !!! 
     NUF.Assert.That(System.Convert.ToInt32(1.499999D), NUF.Is.EqualTo(1)); 
     NUF.Assert.That(System.Convert.ToInt32(1.500000D), NUF.Is.EqualTo(2)); //!!! row 3
  }
Run Code Online (Sandbox Code Playgroud)

通过转换和Convert.ToInt32(参见第2行和第3行)以不同方式转换相同的double值(1.5D),并且在不同模式下舍入两个具有相同尾数(0.5和1.5)的double(参见第1行和第2行) .这是一个错误吗?

Jon*_*eet 8

不,这是记录在案的行为.Convert.ToInt32(double)向上或向下舍入一个数字,中间点向四舍五入到均匀:

回报价值

value,四舍五入到最近的32位有符号整数.如果value是两个整数之间的中间值,则返回偶数; 也就是说,4.5转换为4,5.5转换为6.

从C#3规范的第6.2.1节开始,铸造总是向零舍入(例如,1.8轮到1)

...

否则,源操作数向零舍入为最接近的整数值.如果此整数值在目标类型的范围内,则此值是转换的结果.

请注意,这不只是银行家舍入:它是关于一般取整:有之间的差异(int)0.9Convert.ToInt32(0.9).