我有这个“科学应用程序”,其中 Single
值在显示在 UI 中之前应该四舍五入。根据this MSDN article ,由于“精度损失”,Math.Round(Double, Int32)
方法有时会出现“意外”行为,例如将 2.135 四舍五入为 2.13 而不是 2.14。
据我了解,此问题与“银行家四舍五入”无关(参见示例 this question)。
在应用程序中,显然有人选择通过在舍入之前将 Single
显式转换为 Decimal
来解决此问题(即 Math.Round((Decimal) mySingle, 2)
) 改为调用 Math.Round(Decimal, Int32)
重载。除了可能出现的二进制到十进制转换问题之外,如果 Single
值太小或太大而无法容纳,此“解决方案”还可能导致抛出 OverflowException
Decimal
类型。
如果转换失败,捕获此类错误以从 Math.Round(Double, Int32)
返回结果,这并不是完美的解决方案。重写应用程序也不会一直使用 Decimal
。
是否有或多或少“正确”的方法来处理这种情况,如果有,可能是什么?
最佳答案
我认为您现有的解决方案(使用 Math.Round 的 Decimal
版本)是正确的。
潜在的问题是您希望数字根据以 10 为底的表示形式进行四舍五入,但您已将它们存储为以 2 为底的 float 。提供的 2.135 示例是基数 2 表示与基数 10 不完全匹配的边缘情况之一。
要获得预期的舍入行为,您必须将数字转换为以 10 为基数。最简单的方法正是您已经在做的:暂时将数字转换为 Decimal
足以调用 Math.Round
。
关于c# - 四舍五入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31053724/