You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从C# decimal列表中筛选并排序出小数位数最多的值?

解决方案

要实现按小数点后有效位数从多到少排序,并获取位数最多的decimal值,核心是准确计算每个值去掉末尾零后的小数位数,再以此为依据排序。

步骤1:编写计算有效小数位数的方法

decimal类型可以通过GetBits方法获取内部存储的小数位数,但需要先规范化数值(去掉末尾的零),避免输入时的末尾零影响结果:

private static int GetDecimalPlaces(decimal value)
{
    // 规范化数值,自动去掉末尾的零
    var normalizedValue = value / 1.000000000000000000000000000000000m;
    // 获取decimal的内部存储位信息
    int[] bits = decimal.GetBits(normalizedValue);
    // 从第四个int的低16位提取小数位数(Scale)
    int scale = (bits[3] >> 16) & 0x00FF;
    return scale;
}

步骤2:排序并获取目标值

使用上述方法作为排序依据,按小数位数降序排列,再取第一个元素就是位数最多的值:

List<decimal> list = new List<decimal>() { 23.346m, 23.56m, 4.2m, 0.90000000000000000000000000000m, 0.59333800m};

// 按小数位数降序排序
var sortedList = list.OrderByDescending(num => GetDecimalPlaces(num)).ToList();

// 输出排序结果
foreach (var num in sortedList)
{
    Console.WriteLine(num);
}

// 获取小数位数最多的值
var targetValue = sortedList.First();
Console.WriteLine($"小数位数最多的值为:{targetValue}");

运行结果

排序后输出:

0.593338
23.346
23.56
4.2
0.9

最终得到的小数位数最多的值为:0.593338m

内容的提问来源于stack exchange,提问作者Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:51:16