根据文档,decimal.Round方法使用了一种从圆到平的算法,这在大多数应用中并不常见.所以我总是写一个自定义函数来实现更自然的取整算法:

public static decimal RoundHalfUp(this decimal d, int decimals)
{
    if (decimals < 0)
    {
        throw new ArgumentException("The decimals must be non-negative", 
            "decimals");
    }

    decimal multiplier = (decimal)Math.Pow(10, decimals);
    decimal number = d * multiplier;

    if (decimal.Truncate(number) < number)
    {
        number += 0.5m;
    }
    return decimal.Round(number) / multiplier;
}

有人知道这个框架设计决定背后的原因吗?

框架中是否内置了舍入半向上算法?或者可能是一些非托管的Windows API?

对于初学者来说,简单地写decimal.Round(2.5m, 0),期望结果是3,结果却是2,这可能会误导他们.

推荐答案

可能是因为这是一个更好的算法.在进行多次四舍五入的过程中,你会平均得出所有的.5都是上下四舍五入.这可以更好地估计实际结果,例如,添加一组四舍五入的数字.我想说,尽管这不是一些人所期望的,但这可能是更正确的做法.

.net相关问答推荐

.NET Blazor-使用子组件中的处理程序方法进行双向数据绑定

为什么.Net 8.0.100是预览版?

CLR如何在后台优化布尔比较操作?

为什么这个同步运行的异步睡眠会挂起?

防止在 .NET 上构建路径中的反斜杠以进行跨平台部署

C#字符串的GetHashCode()是如何实现的?

为什么这两个比较有不同的结果?

在 C# 中生成随机小数

为什么 SortedSet.GetViewBetween 不是 O(log N)?

SqlDateTime.MinValue != DateTime.MinValue,为什么?

是否可以模拟 .NET HttpWebResponse?

如何以编程方式判断类型是 struct 还是类?

.NET 4.0 中有内置的二叉搜索树吗?

使用多个 MemoryCache 实例

C# 中的 myCustomer.GetType() 和 typeof(Customer) 有什么区别?

创建多个线程并等待所有线程完成

WCF反序列化如何在不调用构造函数的情况下实例化对象?

我不了解应用程序域

使用 lambda 表达式代替 IComparer 参数

在 Windows 窗体 C# 应用程序中拥有配置文件的最简单方法