【问题标题】:Why does System::Convert have such strange defined behaviour for rounding?为什么 System::Convert 具有如此奇怪的舍入定义行为?
【发布时间】:2017-08-14 13:37:39
【问题描述】:

我在看MSDN documentation for System::Convert::ToUInt32(Double),返回值是“四舍五入到最接近的 32 位无符号整数的值。如果值在两个整数之间,则返回偶数;即 4.5转换为 4,而 5.5 转换为 6。”这似乎是一种非常奇怪的四舍五入方法,实际上似乎使该函数不适合我想要使用它的大多数情况。有什么理由应该这样吗?

【问题讨论】:

  • 这个和C++有关,怎么弄?充其量 - 这是关于 C++/CLI 的问题。请edit您的问题带有标签,即实际上,与您的问题相关。
  • 它被称为Round-half-to-even or Bankers Rounding btw,它的目的是平均分配和打破关系。
  • 处理器非常喜欢它,在 x86 代码中实现为 FISTP 指令。这影响了 Math::Round() 和 Convert::ToInt32() 的默认选择。 8087 协处理器设计有很多怪癖,但迎合那些想为该选项支付(很多)额外费用的人可能与它有关:)

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


【解决方案1】:

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

这是up-to-date official documentation for Convert.Uint32(double), 它实现了通常所说的“四舍五入”或“银行家四舍五入”,请参阅wikipedia 上的参考资料。

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

此外,“银行家四舍五入”不会像“从零取整一半”方法那样受到负面或正面偏差的影响,至少在最合理的分布上是如此。因此,它被认为是一种“更好”的舍入方法。

【讨论】:

  • 出于某种原因,我链接到了错误的文档页面(现已修复),我不应该包含 c++ 标记,而是包含 c++-cli 标记,有人善意地纠正了该标记。谢谢你的信息,但你能告诉我为什么这可能比人们通常在高中教授的标准四舍五入程序更受欢迎吗?
  • @tomd 编辑了我的答案以添加更多信息和对您的评论的答案。
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2014-02-26
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多