如何从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
相关产品推荐
相关产品推荐

