为什么System :: Convert对舍入有这么奇怪的定义行为?

时间:2017-03-22 12:28:20

标签: visual-studio visual-c++ c++-cli

我正在查看MSDN documentation for System::Convert::ToUInt32(Double),并且返回值被声明"值四舍五入到最接近的32位无符号整数。如果值在两个整数之间,则返回偶数;也就是说,4.5转换为4,5.5转换为6。"这似乎是一个非常奇怪的数字轮回方式,实际上似乎使该函数不适合我想要使用它的大多数情况。任何理由应该是这样的吗?

1 个答案:

答案 0 :(得分:2)

这个问题似乎与C ++编程语言(尽管有标签)有关,但与C#有关。

这是up-to-date official documentation for Convert.Uint32(double), 这实现了通常所说的“圆形一半甚至”或“银行家四舍五入”,参见wikipedia的参考文献。

IEEE 754标准(wikipedia reference here)描述了浮点数(例如double)的舍入规则。微软只是遵循这些规则。

作为补充,“银行家四舍五入”不会像“半零距离”方法那样遭受负面或正面偏见,至少在大多数合理分布上都是如此。因此,它被认为是一种“更好”的舍入方法。