c# - 四舍五入

标签 c# .net

我有这个“科学应用程序”,其中 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/

相关文章:

reactjs - 在 react 中使用 signalR 时从方法中删除订阅的处理程序

c# - 从 PInvoke 返回一个字符串?

javascript - 从不同的文件夹访问母版页

java - VBA 中的备忘录实现

C# 更新密码 Renci.SshNet

.net - 当非托管依赖项发生冲突时如何使用 2 个第三方 .net 库?

c# - 是否可以通过 3rd 方库获取当前正在执行的委托(delegate)(不是 MethodBase/MethodInfo)?

c# - 我如何计算元素直到找到好的元素?

c# - 在 mvc 中使用 dapper 的动态结果

c# - Fluent API - 一对多关系